Maison  >  Article  >  Java  >  15 questions et réponses d'entretien avancées sur le multithreading Java

15 questions et réponses d'entretien avancées sur le multithreading Java

高洛峰
高洛峰original
2017-01-16 16:09:161694parcourir

Questions d'entretien sur Java Threading

Les questions sur le multi-threading et la concurrence sont une partie essentielle de tout entretien Java. Si vous souhaitez obtenir un poste d'information au front-office dans une banque d'investissement en actions, vous devez être prêt à répondre à de nombreuses questions sur le multithread. Le multithreading et la concurrence sont des sujets très populaires dans la banque d'investissement, notamment en ce qui concerne le développement du trading électronique. Ils posent aux intervieweurs beaucoup de questions déroutantes sur les threads Java. L'intervieweur veut simplement s'assurer qu'il a suffisamment de connaissances sur les threads Java et la concurrence, car de nombreux candidats ne font qu'effleurer la surface. Les systèmes de négociation électronique à volume élevé et à faible latence pour les transactions directes sur le marché sont intrinsèquement concurrents. Voici les questions de thread Java que j'aime poser à différents moments et à différents endroits. Je ne donne pas de réponses, mais chaque fois que cela est possible, je vous donne des indices, et parfois ces indices suffisent à répondre à la question. Il existe un nombre croissant de questions concernant les outils de concurrence et les collections simultanées faisant référence au package de concurrence Java 5. Parmi ces problèmes, ThreadLocal, Blocking Queue, Counting Semaphore et ConcurrentHashMap sont les plus populaires.


15 questions et réponses d'entretien multithread Java

1) Il y a maintenant trois threads T1, T2 et T3 Comment vous assurer que T2 est exécuté après l'exécution de T1. , et T3 est exécuté après Execute après que T2 soit exécuté ?

Cette question du fil de discussion est généralement posée lors du premier tour ou de l'entretien téléphonique pour tester si vous êtes familier avec la méthode « rejoindre ». Ce problème multi-thread est relativement simple et peut être implémenté à l'aide de la méthode join.

2) Quels sont les avantages de l'interface Lock par rapport aux blocs synchronisés en Java ? Vous devez implémenter un cache efficace qui permet à plusieurs utilisateurs de lire, mais qui ne permet qu'à un seul utilisateur d'écrire, préservant ainsi son intégrité. Comment implémenteriez-vous cela ?

Le plus grand avantage de l'interface de verrouillage dans la programmation multithread et simultanée est qu'elle fournit des verrous séparés pour la lecture et l'écriture, ce qui vous permet d'écrire des structures de données hautes performances comme ConcurrentHashMap et le blocage conditionnel. Les questions d'entretien du fil Java sont de plus en plus basées sur les réponses de l'intervieweur. Je vous recommande fortement de lire sur Locks avant de vous lancer dans un entretien multithread, car il est actuellement largement utilisé pour créer des caches côté client et un espace de connexion de transaction pour les terminaux de trading électronique.

3) Quelle est la différence entre les méthodes d'attente et de veille en Java ?

Questions d'entretien sur le fil Java qui sont généralement posées lors des entretiens téléphoniques. La plus grande différence est que wait libère le verrou pendant l'attente, tandis que sleep maintient toujours le verrou. Wait est généralement utilisé pour l'interaction entre les threads et sleep est généralement utilisé pour suspendre l'exécution.

4) Implémentez la file d'attente de blocage en Java.

Il s'agit d'une question d'entretien multithread relativement difficile qui peut atteindre de nombreux objectifs. Premièrement, il peut tester si le candidat est réellement capable d'écrire des programmes à l'aide de threads Java ; deuxièmement, il peut tester la compréhension du candidat des scénarios de concurrence, et vous pouvez poser de nombreuses questions sur cette base. S'il utilise les méthodes wait() et notify() pour implémenter une file d'attente de blocage, vous pouvez lui demander de la réécrire en utilisant les dernières classes de concurrence de Java 5.

5) Écrivez du code en Java pour résoudre le problème producteur-consommateur.

C'est très similaire à la question ci-dessus, mais cette question est plus classique. Parfois, les questions suivantes sont posées lors des entretiens. Comment résoudre le problème producteur-consommateur en Java ? Bien sûr, il existe de nombreuses solutions, j'ai partagé une méthode implémentée à l'aide d'une file d'attente de blocage. Parfois, ils demandent même comment mettre en œuvre le problème des philosophes de la restauration.

6) Programmer un programme en Java qui provoquera un blocage. Comment allez-vous le résoudre ?

C'est ma question d'entretien de fil Java préférée, car même si le problème de blocage est très courant lors de l'écriture de programmes simultanés multithread, de nombreux candidats ne peuvent pas écrire de code sans blocage (code sans blocage ?), ils ont eu du mal. Dites-leur simplement que vous disposez de N ressources et de N threads et que vous avez besoin de toutes les ressources pour terminer une opération. Pour plus de simplicité, n peut ici être remplacé par 2. Des données plus volumineuses rendront le problème plus compliqué. Obtenez plus d’informations sur les blocages en évitant les blocages en Java.

7) Que sont les opérations atomiques ? Que sont les opérations atomiques en Java ?

Une question d'entretien de fil Java très simple. La question suivante est que vous devez synchroniser une opération atomique.

8) Quel est le rôle clé de volatile en Java ? Comment l'utiliser ? En quoi est-ce différent des méthodes synchronisées en Java ?

Depuis Java 5 et le modèle de mémoire Java modifié, les problèmes de threading basés sur le mot-clé volatile sont devenus de plus en plus populaires. Vous devez être prêt à répondre aux questions sur la manière dont les variables volatiles garantissent la visibilité, l'ordre et la cohérence dans un environnement simultané.

9) Qu'est-ce qu'une condition de concurrence ? Comment identifier et résoudre la concurrence ?

C'est une question qui apparaît dans les étapes avancées des entretiens multi-threads. La plupart des intervieweurs vous poseront des questions sur une situation de concurrence que vous avez rencontrée récemment et sur la manière dont vous l'avez résolue. Parfois, ils écrivent du code simple et vous permettent de détecter des conditions de concurrence dans le code. Vous pouvez vous référer à mon article précédent sur les conditions de concurrence Java. À mon avis, c'est l'une des meilleures questions d'entretien du fil Java, elle peut détecter avec précision l'expérience du candidat dans la résolution de conditions de concurrence ou dans l'écriture de code exempt de concurrence avec les données ou de toute autre condition de concurrence (cette phrase qui est exempte de course aux données sera pas traduire). Le meilleur livre sur ce sujet est "Concurrency practices in Java".

10) Comment allez-vous utiliser le thread dump ? Comment analyseriez-vous un thread dump ?

Sous UNIX, vous pouvez utiliser kill -3, puis le thread dump imprimera le journal, sous Windows, vous pouvez utiliser "CTRL Break". Question d'entretien de fil de discussion très simple et professionnelle, mais délicate s'il vous demande comment l'analyser.

11) Pourquoi la méthode run() s'exécute-t-elle lorsque nous appelons la méthode start() ? Pourquoi ne pouvons-nous pas appeler directement la méthode run() ?

C'est une autre question d'entretien multi-thread Java très classique. C'était aussi ma confusion lorsque j'ai commencé à écrire des programmes de threads. De nos jours, cette question est généralement posée lors d'entretiens téléphoniques ou lors du premier cycle d'entretiens Java de niveau débutant à intermédiaire. La réponse à cette question devrait être la suivante : lorsque vous appellerez la méthode start(), vous créerez un nouveau thread et exécuterez le code dans la méthode run(). Mais si vous appelez directement la méthode run(), elle ne créera pas de nouveau thread et n'exécutera pas le code du thread appelant. Lisez mon article précédent « La différence entre les méthodes de démarrage et d'exécution » pour plus d'informations.

12) Comment réveiller un thread bloqué en Java ?

C'est une question difficile concernant les discussions et le blocage, et elle propose de nombreuses solutions. Je ne pense pas qu'il existe un moyen d'abandonner le thread s'il rencontre un bloc IO. Si un thread est bloqué en appelant wait(), sleep() ou join(), vous pouvez interrompre le thread et le réveiller en lançant InterruptedException. Mon article précédent "Comment gérer les méthodes de blocage en Java" contient de nombreuses informations sur la gestion du blocage des threads.

13) Quelle est la différence entre CycliBarriar et CountdownLatch en Java ?

Cette question du fil de discussion est principalement utilisée pour tester si vous êtes familier avec le package concurrent dans JDK5. La différence entre les deux est que CyclicBarrier peut réutiliser les barrières franchies, tandis que CountdownLatch ne peut pas être réutilisé.

14) Qu'est-ce qu'un objet immuable et comment aide-t-il à écrire des applications concurrentes ?

Une autre question d'entretien multi-thread classique, qui n'est pas directement liée aux fils de discussion, mais qui aide indirectement beaucoup. Cette question d'entretien Java peut devenir très délicate s'il vous demande d'écrire un objet immuable ou s'il vous demande pourquoi String est immuable.

15) Quels sont les problèmes courants que vous rencontrez dans les environnements multithread ? Comment l'avez-vous résolu ?

L'interface mémoire, les conditions de concurrence critique, les blocages, les livelocks et la famine sont couramment rencontrés dans les programmes multithread et simultanés. Les problèmes sont infinis, et si vous vous trompez, il sera difficile de les trouver et de les déboguer. Il s'agit principalement de questions de thread Java basées sur des entretiens et non sur des applications pratiques.

Quelques questions supplémentaires :

1) Quelle est la différence entre les threads verts et les threads locaux en Java ?

2) Quelle est la différence entre les threads et les processus ?

3) Qu'est-ce que le changement de contexte en multi-threading ?

4) Quelle est la différence entre une impasse et un livelock, et la différence entre une impasse et une tarte ?

5) Quel est l'algorithme de planification des threads utilisé en Java ?

6) Qu'est-ce que la planification des threads en Java ?

7) Comment gérez-vous les exceptions incapables dans les threads ?

8) Qu'est-ce qu'un groupe de threads et pourquoi n'est-il pas recommandé en Java ?

9) Pourquoi est-il préférable d'utiliser le framework Executor plutôt que d'utiliser l'application pour créer et gérer des threads ?

10) Quelle est la différence entre Executor et Executors en Java ?

11) Comment trouver quel thread utilise le plus de temps CPU sous Windows et Linux ?

Pour plus de 15 questions et réponses d'entretien multi-thread Java avancées, veuillez faire attention au site Web PHP chinois !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn