Questions d'entretien sur le fil Java
Les questions sur le multithreading et la concurrence sont une partie essentielle de tout entretien Java. Si vous souhaitez obtenir un poste d'information au front-office dans n'importe quelle 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 que T3 est exécuté après l'exécution de T2 ?
Cette question du fil de discussion est généralement posée lors du premier tour ou de l'entretien téléphonique pour vérifier 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 au bloc synchronisé 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 telles que 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é dans la mise en cache côté client et dans l'espace de connexion commerciale pour la construction de terminaux de trading électroniques.
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) Utilisez Java pour implémenter la file d'attente de blocage.
Il s'agit d'une question d'entretien multithread relativement difficile qui sert à de nombreuses fins. 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 entretiens poseront la question suivante. Comment résoudre le problème producteur-consommateur en Java ? Bien sûr, il existe de nombreuses solutions, j'ai partagé une méthode utilisant des files d'attente bloquantes. Parfois, ils demandent même comment mettre en œuvre le problème des philosophes de la restauration.
6) Si vous programmez 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 les problèmes de blocage sont très courants lors de l'écriture de programmes simultanés multithread, de nombreux candidats ne peuvent pas écrire de code sans blocage (code sans blocage ?) et ils ont 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) Qu’est-ce que l’opération atomique ? Que sont les opérations atomiques en Java ?
Question d'entretien très simple avec le fil Java, 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 que Java 5 et le modèle de mémoire Java ont changé, les problèmes de thread 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 revient aux é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 utiliserez-vous le thread dump ? Comment analyseriez-vous un thread dump ?
Sous UNIX, vous pouvez utiliser kill -3 et 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 la méthode run() directement ?
C'est une autre question d'entretien multithread 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 ?
Il s’agit d’une question difficile concernant les threads 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 simultanées ?
Autre question d'entretien classique sur le multi-threading, elle n'est pas directement liée aux threads, mais elle aide beaucoup indirectement. 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 ?
Les programmes multithreads et concurrents fréquemment rencontrés sont l'interface mémoire, les conditions de concurrence critique, les blocages, les livelocks et la famine. 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 un thread et un processus ?
3) Qu'est-ce que le changement de contexte en multithreading ?
4) Quelle est la différence entre une impasse et un livelock, et la différence entre une impasse et un gâteau ?
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 ?