Top 40 Java Interviewvragen en -antwoorden over multithreading (2026)

Java Multithreading interviewvragen

Voorbereiden op een Java Multithreading-interview? Het is essentieel om te begrijpen wat u te wachten staat. De tweede zin moet het volgende bevatten: "Java Interviewvragen over multithreadingwaardoor diepgang, aanpak en technische denkwijze aan het licht komen.

De mogelijkheden in multithreaded ontwikkeling blijven groeien naarmate systemen schalen, wat vraagt ​​om sterke technische expertise en praktische technische ervaring. Functies voor starters, professionals met een gemiddeld niveau en senior professionals vereisen analytisch vermogen, domeinkennis en een solide basis om zowel gangbare als geavanceerde concepten te begrijpen. Deze vragen en antwoorden helpen kandidaten praktische uitdagingen aan te gaan en tegelijkertijd hun diepgaande ervaring in het vakgebied aan te tonen.
Lees meer ...

👉Gratis PDF-download: Java Interviewvragen en -antwoorden over multithreading

Top Java Interviewvragen en -antwoorden over multithreading

1) Wat is multithreading in Java En waarom wordt het gebruikt?

Multithreading-in Java Parallellisatie is een programmeerconcept dat gelijktijdige uitvoering van twee of meer threads mogelijk maakt om het CPU-gebruik te maximaliseren. Elke thread draait onafhankelijk, maar deelt dezelfde procesbronnen, zoals geheugen. Dit verbetert de prestaties, met name bij taken die geparallelliseerd kunnen worden, zoals I/O-bewerkingen, berekeningen of de responsiviteit van de grafische gebruikersinterface (GUI).

Voordelen zijn onder andere:

  • Beter CPU-gebruik
  • Snellere uitvoering van zelfstandige taken
  • Verbeterde reactiesnelheid van de applicatie

Voorbeeld: In een webserver kunnen meerdere verzoeken gelijktijdig worden verwerkt met behulp van threads, waardoor blokkering voor elk gebruikersverzoek wordt voorkomen.


2) Leg de levenscyclus van een thread uit in Java.

A Java Een thread doorloopt meerdere toestanden gedurende zijn levensduur. Levenscyclus van een thread kan als volgt worden samengevat:

Land Beschrijving
New De thread is aangemaakt, maar nog niet gestart.
uitvoerbare De thread is klaar om te starten of is al aan het starten.
geblokkeerd Thread wacht op een monitorvergrendeling.
Het wachten Een thread wacht oneindig lang op een signaal van een andere thread.
Getimed wachten Een thread wacht op een bepaalde periode.
Beëindigd De thread is klaar met uitvoeren.

Voorbeeld: . t.start() wordt aangeroepen, de thread gaat over van New naar uitvoerbare.


3) Wat is het verschil tussen een proces en een thread?

Beide representeren uitvoeringseenheden, maar hun gedrag en geheugenbeheer verschillen.

criteria Proces Draad
Geheugen Heeft een eigen geheugenruimte. Deelt geheugen met andere threads.
Communicatie Vereist interprocescommunicatie (IPC). Makkelijker via gedeeld geheugen.
Aanmaak tijd Duurder om te produceren. Lichtgewicht en sneller.
Storing Een procesfout heeft geen gevolgen voor anderen. Een threadfout kan andere threads beïnvloeden.

Voorbeeld: Een browser (proces) kan meerdere threads hebben: één voor het weergeven van de inhoud en een andere voor het verwerken van gebruikersinvoer.


4) Hoe werkt synchronisatie in Java?

SyncChronolisatie zorgt ervoor dat slechts één thread tegelijk toegang heeft tot een gedeelde bron, waardoor wordt voorkomen dat threads tegelijkertijd toegang krijgen tot een gedeelde bron. race voorwaarden en inconsistentie van gegevens.

De synchronized Het sleutelwoord wordt gebruikt om een ​​object of een methode te vergrendelen.

Soorten synchronisatie:

  1. Syncgekroonde methode – blokkeert de hele methode.
  2. Syncgekroond Blok – vergrendelt een specifiek gedeelte van de code.

Voorbeeld:

synchronized void increment() {
    count++;
}

Dit zorgt ervoor dat slechts één thread tegelijk wijzigingen kan aanbrengen. count op een moment.


5) Wat zijn de verschillende manieren om een ​​thread te maken in Java?

Er zijn twee primaire manieren en een moderne aanpak:

  1. Door te verlengen Thread klasse
    class MyThread extends Thread {
        public void run() { System.out.println("Thread running"); }
    }
    new MyThread().start();
    
  2. door de implementatie van Runnable interface
    class MyRunnable implements Runnable {
        public void run() { System.out.println("Runnable running"); }
    }
    new Thread(new MyRunnable()).start();
    
  3. gebruik Callable en Future (moderne aanpak) – maakt het mogelijk om resultaten terug te geven en uitzonderingen te genereren.

6) Wat is het verschil tussen de methoden start() en run() in Java draden?

Aspect start() run()
Thread maken Maakt een nieuwe thread aan. Wordt uitgevoerd in de huidige thread.
Aanroeping Roept de JVM aan om de nieuwe thread in te plannen. Normale methodeaanroep.
samenloop Wordt asynchroon uitgevoerd. Wordt sequentieel uitgevoerd.

Voorbeeld: het roepen t.start() begint een nieuwe thread; bellen t.run() Voert de code eenvoudigweg uit zoals een reguliere methode.


7) Leg het concept van draadveiligheid uit. Hoe kun je dit bereiken?

Draadveiligheid zorgt ervoor dat meerdere threads toegang hebben tot gedeelde gegevens zonder deze te beschadigen.

Dit wordt bereikt door middel van synchronisatiemechanismen zoals:

  • synchronized blokken/methoden
  • volatile trefwoord
  • Sloten (ReentrantLock, ReadWriteLock)
  • Thread-veilige klassen (ConcurrentHashMap, CopyOnWriteArrayList)
  • Atomic klassen (AtomicInteger, AtomicBoolean)

Voorbeeld:

gebruik AtomicInteger vermijdt de noodzaak voor expliciete synchronisatie:

AtomicInteger count = new AtomicInteger();
count.incrementAndGet();

8) Wat is het verschil tussen de methoden wait(), sleep() en yield()?

Methode Hoort bij Ontgrendeling Doel Duur
wait() Object klasse Ja Wacht op melding Totdat er een melding is gemaakt
sleep() Thread klasse Nee Pauzeert de uitvoering Vaste tijd
yield() Thread klasse Nee Geeft de planner een hint om over te schakelen. Onvoorspelbare

Voorbeeld: wait() wordt gebruikt voor communicatie tussen threads, terwijl sleep() Pauzeert alleen een thread.


9) Hoe verbetert het Executor Framework het threadbeheer?

Het Executor Framework ontkoppelt het aanmaken van threads en het indienen van taken, en beheert threads efficiënt via een pool. Het maakt deel uit van java.util.concurrent.

Voordelen:

  • Hergebruikt bestaande threads → verbetert de prestaties.
  • Biedt flexibel threadpoolbeheer (FixedThreadPool, CachedThreadPool, Enz.).
  • Vermindert de overhead van het aanmaken/vernietigen van threads.

Voorbeeld:

ExecutorService executor = Executors.newFixedThreadPool(5);
executor.submit(() -> System.out.println("Task executed"));
executor.shutdown();

10) Welke verschillende typen threadpools zijn er beschikbaar in Java?

Threadpools beheren een set workerthreads en hergebruiken deze voor meerdere taken.

Type threadpool Methode Beschrijving
Vaste threadpool newFixedThreadPool(n) Vast aantal threads.
CachedThreadPool newCachedThreadPool() Maakt threads aan wanneer nodig en hergebruikt inactieve threads.
SingleThreadExecutor newSingleThreadExecutor() Eén thread voor opeenvolgende taken.
Geplande threadpool newScheduledThreadPool(n) Voert taken periodiek of na een bepaalde tijd uit.
WerkstelenPool newWorkStealingPool() Maakt dynamisch gebruik van beschikbare processors.

11) Wat is een deadlock in JavaHoe kan dit voorkomen worden?

A impasse Dit treedt op wanneer twee of meer threads oneindig lang wachten tot de andere threads hun vergrendelingen vrijgeven, waardoor ze allemaal geblokkeerd raken.

Dit gebeurt meestal wanneer meerdere threads vergrendelingen verkrijgen in een inconsistente volgorde.

Voorbeeld:

synchronized (A) {
  synchronized (B) { ... }
}

en nog een discussie:

synchronized (B) {
  synchronized (A) { ... }
}

Preventiestrategieën:

  1. Verkrijg sloten in een vaste volgorde.
  2. Gebruik tryLock() met time-out (ReentrantLock).
  3. Vermijd geneste vergrendelingen waar mogelijk.
  4. Gebruik hulpprogramma's voor gelijktijdige uitvoering zoals java.util.concurrent in plaats van handmatige sloten.

12) Wat is het verschil tussen een gesynchroniseerde vergrendeling en een re-entrant vergrendeling?

Kenmerk synchronized ReentrantLock
Type Keyword Klasse binnen java.util.concurrent.locks
Lock Acquisitie Impliciet Expliciet via lock()
Unlocking Automatisch Moet bellen unlock() handmatig
Poging/Time-out Niet beschikbaar steunen tryLock() en time-out
Eerlijkheidsbeleid Niet configureerbaar Ondersteunt een eerlijke ordening
Voorwaardelijke variabelen Niet ondersteund Ondersteunt meerdere Condition objecten

Voorbeeld:

ReentrantLock lock = new ReentrantLock();
if(lock.tryLock(1, TimeUnit.SECONDS)) {
  try { /* critical section */ } finally { lock.unlock(); }
}

13) Wat is het verschil tussen volatiel en gesynchroniseerd?

Aspect volatile synchronized
Doel Zorgt voor zichtbaarheid Garandeert atomiciteit en zichtbaarheid.
Atomijs Niet gegarandeerd Gegarandeerd
Vergrendelen Nee Ja
Use Case Voor variabelen die gedeeld worden tussen threads Voor kritieke secties

Voorbeeld:

Gebruik volatile voor eenvoudige vlaggen:

volatile boolean running = true;

Gebruik synchronized voor samengestelde bewerkingen:

synchronized void increment() { count++; }

14) Leg het concept van ThreadLocal uit in Java.

ThreadLocal Biedt thread-lokale variabelen, wat betekent dat elke thread zijn eigen geïsoleerde kopie van een variabele heeft. Het wordt gebruikt wanneer je wilt voorkomen dat de status tussen threads wordt gedeeld.

Voorbeeld:

ThreadLocal<Integer> local = ThreadLocal.withInitial(() -> 0);
local.set(local.get() + 1);

Voordelen:

  • Voorkomt gegevenscorruptie door variabelen te isoleren.
  • Ideaal voor gebruikerssessies, transactie-ID's of tijdelijke contextgegevens.

Onjuist gebruik kan echter leiden tot geheugenlekken, vooral in threadpools als deze niet worden gewist (remove()).


15) Wat zijn Atomic-klassen in Java, en waarom worden ze gebruikt?

Atomic-klassen (zoals AtomicInteger, AtomicBoolean, AtomicReference) voorzien lock-vrije draadveilige bewerkingen op afzonderlijke variabelen met behulp van Vergelijken en ruilen (CAS) mechanisme.

Voordelen:

  • Betere prestaties dan gesynchroniseerde blokken voor eenvoudige updates.
  • Vermijd expliciete vergrendeling.

Voorbeeld:

AtomicInteger count = new AtomicInteger(0);
count.incrementAndGet();  // Atomic increment

Ze bevinden zich in de java.util.concurrent.atomic pakket.


16) Wat is een SemaphoreEn waarin verschilt het van een slot?

A Semaphore Hiermee wordt de toegang tot een gedeelde bron geregeld met behulp van een vast aantal toegangsrechten. Het wordt vaak gebruikt om de toegang te beperken of om schaarse bronnen te beheren.

Aspect Semaphore Slot
Doel Beperk gelijktijdige toegang Wederzijdse uitsluiting
vergunningen Kan meerdere exemplaren hebben Slechts één
Het blokkeren van Verkrijgt vergunning Verwerft eigendom
Voorbeeld gebruik Verbinding pooling Bescherm kritieke sectie

Voorbeeld:

Semaphore sem = new Semaphore(3);
sem.acquire();
// Access resource
sem.release();

17) Leg het Fork/Join-framework uit in Java.

De Fork/Join-framework ingevoerd Java 7 is ontworpen voor de parallelle uitvoering van taken die recursief kunnen worden opgesplitst in subtaken. Het maakt gebruik van de werk-stelen algoritmewaarbij inactieve threads werk "stelen" van actieve threads.

Voorbeeld:

class SumTask extends RecursiveTask<Integer> {
  protected Integer compute() {
    if (end - start <= threshold) return computeDirectly();
    int mid = (start + end) / 2;
    SumTask left = new SumTask(start, mid);
    SumTask right = new SumTask(mid, end);
    left.fork();
    return right.compute() + left.join();
  }
}

Use case: Ideaal voor verdeel-en-heers-algoritmen zoals mergesort of parallelle berekeningen.


18) Hoe verbetert CompletableFuture asynchroon programmeren in Java 8 +?

CompletableFuture vereenvoudigt asynchroon programmeren door het mogelijk te maken niet-blokkerend, geketenden componeerbaar taken. Het elimineert de callback-hel.

Voorbeeld:

CompletableFuture.supplyAsync(() -> "Hello")
    .thenApply(str -> str + " World")
    .thenAccept(System.out::println);

Voordelen:

  • Combineer meerdere asynchrone taken.
  • Kettingafhankelijke taken (thenCompose, thenCombine).
  • Behandel uitzonderingen (exceptionally).

Vergelijking:

Anders Future, CompletableFuture Maakt handmatige voltooiing mogelijk en ondersteunt reactieve ketenvorming.


19) Wat is een daemon-thread in Java?

A Daemon-thread Het draait op de achtergrond en levert services aan gebruikersthreads (bijv. garbage collection, timertaken). De JVM beëindigt automatisch alle daemon-threads wanneer er geen gebruikersthreads meer actief zijn.

Voorbeeld:

Thread daemon = new Thread(() -> System.out.println("Daemon running"));
daemon.setDaemon(true);
daemon.start();

kenmerken:

  • Draait op de achtergrond.
  • Wordt automatisch beëindigd wanneer de hoofdthread eindigt.
  • Moet geen cruciale taken uitvoeren.

20) Wat zijn enkele best practices voor multithreading in Java toepassingen?

Belangrijkste praktijken:

  1. Geef de voorkeur aan geavanceerde hulpprogramma's voor gelijktijdige uitvoering. (ExecutorService, BlockingQueue(enz.) in plaats van het handmatig aanmaken van threads.
  2. Vermijd gedeelde, veranderlijke toestanden. Of bescherm het met de juiste synchronisatie.
  3. Gebruik onveranderlijke objecten. waar mogelijk.
  4. Verwerk onderbrekingen in de thread correct.
  5. Vermijd lange wachtrijen.; gebruik wait(), sleep()of CountDownLatch.
  6. Beëindiging van de werkzaamheden op een elegante manier gebruik shutdown() or shutdownNow().
  7. Gebruik gelijktijdige verzamelingen (ConcurrentHashMap, CopyOnWriteArrayList) via gesynchroniseerde wrappers.

Door dit te volgen worden schaalbaarheid, veiligheid en onderhoudbaarheid in gelijktijdige omgevingen gewaarborgd. Java 's.


21) Wat is de Java Het geheugenmodel (JMM) en waarom is het belangrijk bij multithreading?

De Java Geheugenmodel (JMM) Dit definieert hoe threads via het geheugen met elkaar communiceren en hoe wijzigingen die door één thread worden aangebracht, zichtbaar worden voor andere threads.

Het waarborgt consistentie en correctheid in parallelle programma's door regels te definiëren voor zichtbaarheid, ordening en atomiciteit.

sleutel Concepts:

  • Zichtbaarheid: Wijzigingen door één thread moeten zichtbaar zijn voor andere threads (het gebruik van `volatile` helpt hierbij).
  • Gebeurt vóór de relatie: Definieert de volgorde van acties (bijvoorbeeld: ontgrendelen gebeurt vóór vergrendelen op dezelfde monitor).
  • Herordenen: De JVM en de CPU kunnen de volgorde van instructies wijzigen als ze niet gesynchroniseerd zijn.

Voorbeeld: zonder volatileEen wijziging van een vlag in de ene thread is mogelijk niet zichtbaar in een andere, wat kan leiden tot onvoorspelbaar gedrag.


22) Leg het verschil uit tussen ConcurrentHashMap en SynchronizedMap.

Beide zijn schroefdraadveilig, maar ConcurrentHashMap is ontworpen hoge gelijktijdigheid en schaalbaarheid en Collections.synchronizedMap() vergrendelt de hele kaart.

Kenmerk ConcurrentHashMap gesynchroniseerde kaart
Vergrendelen Segmentniveau (gedeeltelijk) Volledige kaart
Prestaties Hoog onder druk Laag onder druk
Null-sleutels/waarden Niet toegestaan Toegestaan
Iteratoren Zwak consistent Snel falen
Gelijktijdige leesbewerkingen Toegestaan geblokkeerd

Voorbeeld: ConcurrentHashMap is ideaal voor multithreaded caches, terwijl synchronizedMap is geschikt voor kleine datasets.


23) Hoe kun je deadlocks detecteren en debuggen in Java toepassingen?

Deadlocks kunnen worden geïdentificeerd met behulp van Thread Dumps en Java diagnostische hulpmiddelen.

benaderingen:

  1. Analyse van threaddumps: Gebruik jstack <pid> om te detecteren “Er is er één gevonden Java-niveau patstelling.”
  2. VisualVM of JConsole: Monitor de status van threads in realtime.
  3. ThreadMXBean API:
    ThreadMXBean bean = ManagementFactory.getThreadMXBean();
    long[] ids = bean.findDeadlockedThreads();
    

Preventietip: Verkrijg vergrendelingen altijd in dezelfde globale volgorde en gebruik vergrendeling op basis van een time-out (tryLock()).


24) Wat is het verschil tussen parallelle streams en threads in Java?

Parallelle stromen intern gebruiken Fork/Join-framework Om bewerkingen automatisch te paralleliseren. Threads daarentegen vereisen handmatig beheer.

Aspect Parallelle stromen Discussies
Abstractie API op hoog niveau Laag niveau besturing
Management Automatisch Handgeschakeld
Stemming Maakt gebruik van ForkJoinPool Aangepaste threadpool
Foutverwerking Beperkte controle volledige controle

Voorbeeld:

list.parallelStream().forEach(System.out::println);

Gebruik parallelle streams voor gegevensverwerkingniet voor taken die expliciete synchronisatie of timingcontrole vereisen.


25) Leg CountDownLatch, CyclicBarrier en Phaser uit en beschrijf de verschillen.

Kenmerk Aftelvergrendeling Cyclische Barrière Phaser
Reset Nee Ja Ja
Partijen vast vast Dynamisch
Use Case Wacht tot de taken zijn voltooid. Wacht tot de draden elkaar raken. Dynamische synchronisatie
Voorbeeld Eenmalige evenementen Herbruikbare barrière Complexe taakcoördinatie

Voorbeeld:

CountDownLatch latch = new CountDownLatch(3);
for (...) new Thread(() -> { ... latch.countDown(); }).start();
latch.await();

Overzicht:

  • Gebruik CountDownLatch wanneer de ene thread op de andere wacht.
  • Gebruik CyclicBarrier wanneer draden op elkaar wachten.
  • Gebruik Phaser voor meerfasige synchronisatie.

26) Wat is het verschil tussen Callable en Runnable in Java?

Aspect uitvoerbare Oproepbaar
Winstwaarde Nee Ja
uitzondering Handling Kan geen gecontroleerde uitzonderingen gooien. Kan gecontroleerde uitzonderingen genereren.
Pakket java.lang java.util.concurrent

Voorbeeld:

Callable<Integer> task = () -> 42;
Future<Integer> result = executor.submit(task);
System.out.println(result.get());

Use case: Callable heeft de voorkeur wanneer u een nodig heeft resultaat or uitzonderingspropagatie.


27) Hoe helpt BlockingQueue in scenario's met producenten en consumenten?

BlockingQueue biedt draadveilige blokkeringsoperaties voor het toevoegen en verwijderen van elementen, waardoor het producent-consumentmodel wordt vereenvoudigd.

Voorbeeld:

BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10);
new Thread(() -> queue.put(1)).start();   // Producer
new Thread(() -> System.out.println(queue.take())).start(); // Consumer

Voordelen:

  • Elimineert expliciet wait() en notify().
  • Ondersteunt zowel begrensde (ArrayBlockingQueue) en onbegrensd (LinkedBlockingQueue) implementaties.

28) Wat zijn enkele veelvoorkomende oorzaken van thread starvation en livelock?

Draadgebrek:

Dit treedt op wanneer threads met een lagere prioriteit nooit CPU-tijd krijgen omdat threads met een hogere prioriteit de overhand hebben.

Livelock:

Dit treedt op wanneer threads actief blijven maar niet verder kunnen gaan omdat ze voortdurend van status veranderen als reactie op elkaar (zoals twee mensen die herhaaldelijk opzij stappen in een gang).

Preventietechnieken:

  • Vermijd overmatig vergrendelen.
  • Gebruik eerlijke sloten (new ReentrantLock(true)).
  • Vermijd onnodige wachttijden.
  • Gebruik threadplanning op de juiste manier.

29) Hoe kun je de prestaties van multithreaded verbeteren? Java toepassingen?

Belangrijkste strategieën:

  1. Gebruik draadpools in plaats van steeds nieuwe discussies te starten.
  2. Beperk de synchronisatieomvang tot een minimum (vergrendel alleen wat nodig is).
  3. Verkiezen gelijktijdige datastructuren.
  4. Gebruik onveranderlijke objecten waar mogelijk.
  5. Voorkom onterechte deling door thread-lokale gegevens te scheiden.
  6. Stem het aantal threads af op het aantal CPU-cores.
  7. Gebruik asynchrone I/O voor blokkerende taken.

Voorbeeld: Gebruik ForkJoinPool or CompletableFuture voor parallelle taken om het CPU-gebruik te maximaliseren.


30) Beschrijf een praktijkvoorbeeld van multithreading dat u hebt behandeld in Java.

Scenariovoorbeeld:

In een betalingsverwerkingssysteem moeten meerdere transacties gelijktijdig worden verwerkt, waarbij consistentie en integriteit gewaarborgd moeten blijven.

Implementatiestappen:

  1. Gebruikt UitvoerderService om worker threads te beheren.
  2. Toegepast ConcurrentHashMap voor het bijhouden van transactiestatussen.
  3. Geïmplementeerd ReentrantLock voor vergrendeling op accountniveau.
  4. Gebruikt Aftelvergrendeling voor batchsynchronisatie.
  5. Toegevoegd VoltooibareToekomst voor het afhandelen van asynchrone reacties.

Resultaat: De doorvoer is met 35% verbeterd en de gemiddelde transactievertraging is met 40% verminderd.


31) Wat zijn virtuele threads in JavaEn hoe verschillen ze van traditionele draden?

Virtuele threads (geïntroduceerd in Java 21) zijn lichtgewicht threads die door de JVM worden beheerd in plaats van door het besturingssysteem. Ze verminderen de overhead van gelijktijdigheid aanzienlijk, waardoor duizenden (of miljoenen) taken tegelijkertijd kunnen worden uitgevoerd.

Kenmerk Platformthreads Virtuele threads
Beheerd door OS JVM
Aanmaakkosten Hoog Heel Laag
Gelijktijdigheidsniveau Beperkt aantal (ongeveer duizenden) Enorm (~miljoenen)
Scheduling OS-niveau JVM-coöperatief
Use Case CPU-gebonden taken I/O-intensieve of taken met hoge gelijktijdigheid

Voorbeeld:

Thread.startVirtualThread(() -> System.out.println("Virtual thread running"));

Belangrijkste voordeel:

Virtuele threads maken gelijktijdige uitvoering op grote schaal mogelijk zonder systeembronnen te blokkeren.


32) Wat is gestructureerde gelijktijdigheid in JavaWaarom is dat belangrijk?

Gestructureerde gelijktijdigheid (voorvertoning in Java 21) vereenvoudigt multithreaded programmering door meerdere gelijktijdige taken als één te behandelen enkele gestructureerde eenheidHet zorgt ervoor dat taken gezamenlijk worden gestart, beheerd en beëindigd, wat de betrouwbaarheid en leesbaarheid verbetert.

Voorbeeld:

try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
    Future<String> user = scope.fork(() -> findUser());
    Future<Integer> order = scope.fork(() -> fetchOrderCount());
    scope.join();  
    scope.throwIfFailed();
    System.out.println(user.resultNow() + " has " + order.resultNow() + " orders.");
}

Voordelen:

  • Eenvoudigere annulering en foutvoortplanting.
  • Geen losse threads.
  • Voorspelbare taaklevenscyclus.

33) Wat zijn reactieve streams in JavaEn hoe verbeteren ze de gelijktijdigheid?

Reactieve streams een niet-blokkerend, asynchrone Een op tegendruk gebaseerd model voor het verwerken van datastromen.

Ze zijn ontworpen voor hoge doorvoer, Gebeurtenisgestuurd systemen.

Kerninterfaces:

  • Publisher – produceert gegevens.
  • Subscriber – verbruikt data.
  • Subscription – regelt de tegendruk.
  • Processor – fungeert als beide.

Voorbeeld:

Flow.Publisher<Integer> publisher = subscriber -> subscriber.onNext(42);

Gebruik Gevallen:

Reactieve streams vormen de basis voor Projectreactor, RxJavaen Spring WebFluxwaardoor schaalbare API's en microservices mogelijk worden.


34) Hoe ga je op de juiste manier om met threadonderbrekingen in Java?

Door een thread te onderbreken, kan een thread het signaal krijgen dat deze moet stoppen of zijn gedrag moet aanpassen.

Praktische tips:

  1. Controleer altijd Thread.interrupted() in lussen.
  2. Ruim de resources op voordat je afsluit.
  3. Niet onderdrukken InterruptedException.

Voorbeeld:

while (!Thread.currentThread().isInterrupted()) {
    try { Thread.sleep(1000); } 
    catch (InterruptedException e) {
        Thread.currentThread().interrupt(); // restore flag
        break;
    }
}

Veel voorkomende fout:

Het lukt niet om de interruptstatus te herstellen na het opvangen van de interrupt. InterruptedException.


35) Leg het verschil uit tussen parallellisme en gelijktijdigheid.

Hoewel ze vaak door elkaar worden gebruikt, parallellisme en samenloop verwijzen naar verschillende uitvoeringsmodellen.

Concept Definitie Voorbeeld
samenloop Het beheren van meerdere taken door de uitvoering ervan te combineren. Het gelijktijdig verwerken van 1000 klantverzoeken.
Parallellisme Meerdere taken tegelijk uitvoeren Berekeningen uitvoeren over meerdere CPU-kernen

Analogie: Gelijktijdigheid is about structure (zich met veel dingen bezighouden), terwijl parallellisme about execution (veel dingen tegelijk doen).


36) Wat zijn veelgebruikte tools en technieken voor het profileren van schroefdraad in Java?

Om problemen met threads zoals deadlocks, blokkeringen en overmatig CPU-gebruik te diagnosticeren, kunt u verschillende methoden gebruiken. profileringstools.

Gereedschap Doel
jstack Legt een thread dump vast
jconsole / VisualVM Realtime threadmonitoring
Java Vluchtregistrator (JFR) Profilering met lage overheadkosten voor productie
Missiecontrole (JMC) Visualiseert JFR-opnames
async-profiler CPU- en toewijzingsprofilering
ThreadMXBean Programmatische draadinspectie

Voorbeeld (ThreadMXBean):

ThreadMXBean bean = ManagementFactory.getThreadMXBean();
System.out.println(bean.getThreadCount());

37) Wat zijn veelvoorkomende prestatieknelpunten in multithreaded systemen? Java toepassingen?

Typische knelpunten:

  1. Overmatige lock-concurrentie: Meerdere threads strijden om hetzelfde slot.
  2. Valse delen: Threads wijzigen variabelen die dezelfde CPU-cachelijn delen.
  3. Overheadkosten bij contextwisseling: Te veel threads leiden tot vertragingen in de planning.
  4. onjuist Synchronisatie: Dit leidt tot blokkades of impassen.
  5. Geheugenbarrières: Overmatig gebruik van volatiele variabelen.

optimalisaties:

  • Gebruik fijnmazige of lock-vrije structuren.
  • Minimaliseer het aanmaken van threads.
  • Gebruik thread-local storage voor geïsoleerde gegevens.
  • Profiel opstellen vóór optimalisatie.

38) Wat is het verschil tussen lock-free, wait-free en obstruction-free algoritmen?

Type Definitie Garanties
Slotvrij Ten minste één discussieonderwerp boekt vooruitgang. Vooruitgang op systeemniveau.
Wachtvrij Elke thread boekt vooruitgang in afgebakende stappen. Sterkste garantie.
Obstakelvrij Vooruitgang zonder conflicten. Zwakste garantie.

Voorbeeld: AtomicInteger operaties zijn slotvrijBij het blokkeren van wachtrijen worden vergrendelingen gebruikt.

Use case: Lock-free algoritmen zijn ideaal voor hoogwaardige gelijktijdige datastructuren zoals Disruptor of ConcurrentLinkedQueue.


39) Hoe werkt de Java Werkt ForkJoinPool op de achtergrond?

ForkJoinPool is ontworpen verdeel en heers taken en toepassingen werkstelen om de belasting over de threads te verdelen.

Mechanisme:

  • Elke worker-thread onderhoudt zijn eigen deque (dubbelzijdige wachtrij).
  • Wanneer het inactief is, steelt het taken van de deques van andere threads.
  • Minimaliseert conflicten en verhoogt de doorvoer.

Voorbeeld:

ForkJoinPool pool = new ForkJoinPool();
pool.submit(() -> IntStream.range(0, 100).parallel().forEach(System.out::println));

Voordeel: Ideaal voor recursieve en paralleliseerbare workloads (sorteren, berekenen, datatransformatie).


40) Hoe zou u een zeer gelijktijdige applicatie ontwerpen? Java Een systeem dat miljoenen verzoeken per seconde verwerkt?

Voorbeeld Archistructuur:

Om massale gelijktijdigheid te bereiken met veerkracht en schaalbaarheid:

  1. Gebruik virtuele threads voor het verwerken van eenvoudige verzoeken.
  2. Gebruik reactieve streams voor asynchrone I/O-verwerking.
  3. Implementeer gestructureerde gelijktijdigheid. voor beheersbare parallelle taken.
  4. Sla veelgebruikte gegevens op in de cache. gebruik ConcurrentHashMap or Caffeine.
  5. Gebruik thread-veilige wachtrijen. (Disruptor, BlockingQueue) voor het doorgeven van gebeurtenissen.
  6. Monitoren en afstellen met JFR + JMC.
  7. Maak gebruik van CompletableFuture voor asynchrone workflows.

Resultaat: Het systeem realiseert miljoenen gelijktijdige verbindingen met minimale blokkering en geoptimaliseerd resourcegebruik.


🔍 Bovenaan Java Interviewvragen met meerdere threads, inclusief praktijkvoorbeelden en strategische antwoorden.

Hieronder staan ​​tien realistische en veelgestelde vragen. Java multithreading Interviewvragen, inclusief wat de interviewer verwacht en goede voorbeeldantwoorden.

1) Wat is het verschil tussen een proces en een thread in Java?

Verwacht van kandidaat: Aantonen dat je de basisprincipes van het besturingssysteem en de JVM begrijpt, evenals het geheugengebruik en de uitvoeringsstroom.

Voorbeeld antwoord: Een proces is een onafhankelijk programma met een eigen geheugenruimte, terwijl een thread een kleinere uitvoeringseenheid is die binnen een proces draait. Threads delen hetzelfde geheugen en dezelfde resources als het proces, waardoor contextwisseling sneller verloopt en de prestaties verbeteren. Dit gedeelde geheugenmodel maakt efficiënte communicatie mogelijk, maar vereist ook zorgvuldige synchronisatie om raceomstandigheden te voorkomen.


2) Kunt u het doel van het trefwoord 'synchronized' uitleggen en wanneer het gebruikt moet worden?

Verwacht van kandidaat: Het vermogen om gelijktijdigheidscontrole, intrinsieke vergrendelingen en threadveiligheid uit te leggen.

Voorbeeld antwoord: De synchronized Het sleutelwoord `synchronize` zorgt ervoor dat slechts één thread tegelijk toegang heeft tot een kritiek gedeelte van de code. Het wordt gebruikt wanneer gedeelde, veranderlijke gegevens door meerdere threads worden benaderd. Door te synchroniseren op de monitorvergrendeling van een object, voorkomen ontwikkelaars raceomstandigheden en behouden ze de gegevensintegriteit.


3) Beschrijf een uitdagend probleem met multithreading waarmee u te maken hebt gehad en hoe u dit hebt opgelost.

Verwacht van kandidaat: Probleemoplossend vermogen, debugvaardigheden en praktijkervaring met gelijktijdige uitvoering.

Voorbeeld antwoord: In mijn vorige functie stuitte ik op een deadlock-probleem dat werd veroorzaakt doordat twee threads in omgekeerde volgorde op locks wachtten. Ik heb dit opgelost door de code te herstructureren om een ​​consistente volgorde voor het verkrijgen van locks af te dwingen. Dit garandeerde dat threads locks in dezelfde volgorde verkregen, waardoor het risico op een deadlock werd geëlimineerd.


4) Hoe werkt de Java Zorgt het geheugenmodel voor zichtbaarheid en ordening in multithreaded applicaties?

Verwacht van kandidaat: Kennis van JMM-concepten, volatile, gebeurt vóór relaties.

Voorbeeld antwoord: De Java Het geheugenmodel definieert regels voor hoe en wanneer wijzigingen die door één thread zijn aangebracht, zichtbaar worden voor andere threads. Het maakt gebruik van happens-before-relaties die de volgorde garanderen. volatile Zorgt ervoor dat schrijfbewerkingen naar het hoofdgeheugen worden doorgestuurd en dat leesbewerkingen altijd de meest recente waarde ophalen. SyncKroniseringsconstructies creëren ook grenzen die voorafgaan aan gebeurtenissen.


5) Wat is het verschil tussen wait(), notify() en notifyAll()?

Verwacht van kandidaat: Inzicht in de communicatie tussen threads en de werking van objectmonitoring.

Voorbeeld antwoord: De wait() Deze methode zorgt ervoor dat een thread de monitorvergrendeling vrijgeeft en de uitvoering opschort totdat deze een melding ontvangt. notify() Deze methode wekt één wachtende thread, terwijl notifyAll() Deze methode wekt alle threads die op dezelfde monitor wachten. Het vergemakkelijkt de coördinatie tussen threads die afhankelijk zijn van een gedeelde status.


6) Beschrijf een situatie waarin je de prestaties van een multithreaded applicatie moest optimaliseren.

Verwacht van kandidaat: Vermogen om de prestaties van gelijktijdige processen te meten, diagnosticeren en verbeteren.

Voorbeeld antwoord: In mijn vorige functie optimaliseerde ik een multithreaded dataverwerkingssysteem dat te kampen had met doorvoerproblemen. Ik ontdekte dat er sprake was van overmatige lock-concurrentie op een gedeelde bron. Ik loste dit op door het gesynchroniseerde blok te vervangen door een ander blok. ConcurrentHashMapwaardoor de concurrentie werd verminderd en de efficiëntie van parallelle verwerking aanzienlijk werd verbeterd.


7) Hoe zou je een situatie aanpakken waarin meerdere threads op een veilige manier een gedeelde datastructuur moeten bijwerken?

Verwacht van kandidaat: Kennis van gelijktijdige collecties, vergrendelingen en ontwerpstrategieën.

Voorbeeld antwoord: Als meerdere threads een gedeelde datastructuur moeten bijwerken, zou ik kiezen voor een threadveilige collectie uit java.util.concurrent, zoals ConcurrentLinkedQueue or ConcurrentHashMapAls alternatief zou ik expliciete vergrendeling gebruiken met ReentrantLock Als meer gedetailleerde controle vereist is. Deze aanpak garandeert gegevensconsistentie en voorkomt gelijktijdigheidsfouten.


8) Wat is de rol van ExecutorService en waarom heeft deze de voorkeur boven het handmatig aanmaken van threads?

Verwacht van kandidaat: Inzicht in threadpooling, lifecyclemanagement en schaalbaarheid.

Voorbeeld antwoord: ExecutorService Het beheert een pool van worker threads en plant taken efficiënt in. Het heeft de voorkeur omdat het de overhead vermindert door threads te hergebruiken, de schaalbaarheid verbetert en het lifecyclemanagement vereenvoudigt. Het biedt ook nette mechanismen voor het afsluiten van threads en het afhandelen van taakafhandeling.


9) Beschrijf een situatie waarin je een raceconditie moest oplossen. Hoe heb je die geïdentificeerd en verholpen?

Verwacht van kandidaat: Diagnostische technieken, logboekregistratie, debugtools.

Voorbeeld antwoord: Bij mijn vorige baan ontdekte ik een raceconditie in een module voor financiële berekeningen nadat ik inconsistenties in de uitvoer onder belasting had geconstateerd. Ik reproduceerde het probleem met behulp van stresstests en verbeterde logging om de toegangspatronen van threads te volgen. Ik heb het opgelost door de juiste synchronisatie rond het gedeelde rekenblok te introduceren, waardoor het inconsistente gedrag verdween.


10) Hoe ontwerp je een multithreading-oplossing wanneer taken verschillende prioriteiten en uitvoeringstijden hebben?

Verwacht van kandidaat: Het vermogen om oplossingen voor gelijktijdige uitvoering te ontwerpen en geschikte API's te selecteren.

Voorbeeld antwoord: In dit scenario zou ik een geprioriteerde taakwachtrij gebruiken met ThreadPoolExecutor en een op maat gemaakt Comparator Om ervoor te zorgen dat taken met een hogere prioriteit als eerste worden uitgevoerd. Voor taken met een variabele duur zou ik de threadpool dimensioneren op basis van het aantal CPU-cores en monitoringtools gebruiken om de wachtrijgrootte en afwijzingsstrategieën te optimaliseren.

Vat dit bericht samen met: