1. Qu'est-ce que la synchronisation et l'asynchronisme des threads ?
(Recommandations pour plus de questions d'entretien : questions d'entretien Java )
La synchronisation (synchrone) est un rythme coordonné, s'exécutant dans un ordre prédéterminé.
L'asynchrone est à l'opposé de la synchronisation, il ne bloque pas et fonctionne en même temps.
2. Qu'est-ce qu'un fil de discussion dangereux ? Comment le résoudre ? (Points clés)
Qu'est-ce que la sécurité des threads ?
S'il y a plusieurs threads exécutés en même temps dans le processus où se trouve votre code, ces threads peuvent exécuter ce code en même temps. Si les résultats de chaque exécution sont les mêmes que ceux des exécutions monothread et que les valeurs des autres variables sont les mêmes que celles attendues, cela est thread-safe.
En d'autres termes : l'interface fournie par une classe ou un programme est une opération atomique pour les threads ou la commutation entre plusieurs threads ne provoquera pas d'ambiguïté dans les résultats d'exécution de l'interface, ce qui signifie que nous n'avons pas besoin d'envisager la synchronisation problèmes.
Les problèmes de sécurité des threads sont causés par des variables globales et des variables statiques.
S'il n'y a que des opérations de lecture pour les variables globales et les variables statiques dans chaque thread, mais aucune opération d'écriture, d'une manière générale, cette variable globale est thread-safe si plusieurs threads effectuent des opérations d'écriture en même temps, généralement ; La synchronisation des threads doit être prise en compte, sinon la sécurité des threads peut être affectée.
(Tutoriels associés recommandés : Programme d'entrée Java)
Pourquoi les threads ArrayList sont-ils dangereux ? Pourquoi l'utiliser si ce n'est pas sûr ? Comment résoudre l’insécurité des threads ?
Une ArrayList, lors de l'ajout d'un élément, elle peut être complétée en deux étapes :
1. Stockez cet élément à l'emplacement de Items[Size] ;
2. Augmentez la valeur de Taille.
Dans le cas d'un fonctionnement monothread, si Size = 0, après ajout d'un élément, l'élément sera en position 0, et Size=1 et s'il est multi-thread, par exemple, là ; sont deux threads, le thread A stocke d'abord l'élément à la position 0.
Mais à ce moment-là, le processeur planifie la pause du thread A et le thread B a la possibilité de s'exécuter. Le thread B ajoute également des éléments à cette ArrayList, car Size est toujours égal à 0 à ce moment (notez que nous supposons que l'ajout d'un élément nécessite deux étapes et que le thread A n'a terminé que l'étape 1), donc le thread B ajoute également des éléments à Stored at emplacement 0. Ensuite, le thread A et le thread B continuent de s’exécuter, augmentant tous deux la valeur de Size.
D'accord, regardons maintenant la situation d'ArrayList. Il n'y a en fait qu'un seul élément, stocké à la position 0, mais Size est égal à 2. Il s'agit d'un "thread dangereux".
Comment le résoudre ?
Lock (verrouillage d'objet, bloc de code de verrouillage), méthode spin + CAS (verrouillage optimiste), utilisez la classe de données thread-safe fournie par java
3. Fil de discussion? Combien de méthodes existe-t-il ?
1. Héritez de la classe Thread
2. Implémentez l'interface Runnable
3. Implémentez l'interface Callable
Quatrièmement, utiliser Runnalbe L'interface est-elle bonne ? Ou vaut-il mieux hériter de la classe Thread ?
Il est préférable d'implémenter l'interface Runnable.
1. Parce que l'implémentation de l'interface Runnable peut éviter les limitations de l'héritage unique Java.
Quand une classe hérite de Thread, elle ne peut pas hériter d'autres classes. Et lorsqu'une classe implémente Runnable, elle peut également hériter d'autres classes.
2. Plus conforme à la conception orientée objet
La fonction de la méthode run() est d'encapsuler le code à exécuter par le thread. Ensuite, l’objet auquel appartient la méthode run() est l’objet tâche thread. Les objets de sous-classe de la classe Thread sont à la fois des objets thread et des objets tâche thread. Le couplage est très fort.
Avec l'interface Runnable, les tâches de thread et les threads peuvent être découplés, améliorant ainsi l'évolutivité du programme.
(Tutoriels vidéo associés recommandés : Tutoriel vidéo Java)
5. Quelle est la différence entre sleep() et wait() ?
Sleep est une méthode de la classe thread (Thread), qui amène ce thread à suspendre l'exécution pendant une durée spécifiée et à donner des opportunités d'exécution à d'autres threads, mais l'état de surveillance est toujours maintenu et reprendra automatiquement après l'heure. est en place. L’appel de sleep ne libère pas le verrouillage de l’objet.
wait est une méthode de la classe Object. L'appel de la méthode wait sur cet objet amène ce thread à abandonner le verrouillage de l'objet et à entrer dans le pool de verrouillage en attente en attendant cet objet uniquement après la méthode notify (ou notifyAll. ) est émis pour cet objet, ce thread peut entrer dans le pool de verrouillage d'objet et se préparer à obtenir le verrouillage d'objet et à entrer dans l'état d'exécution.
Si la variable est déclarée volatile, elle sera cohérente avec la mémoire principale à chaque accès ; si la variable est accédée dans une méthode synchronisée ou un bloc synchronisé, lorsque le verrou est obtenu à l'entrée du méthode ou bloc et la méthode ou le bloc Les variables sont synchronisées lorsque le verrou est libéré à la sortie.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!