Table des matières
1. Quelle est la différence entre les méthodes ordinaires modifiées synchronisées et les méthodes statiques ? Qu'est-ce que la visibilité ?
2. Quelles sont les catégories de cadenas ?
3. Le principe de la programmation sans verrouillage CAS.
4. Principe de mise en œuvre de ReentrantLock.
5.Principe AQS.
6. Le principe de Synchronized et la différence avec ReentrantLock.
7. Quelles optimisations Synchronized a-t-il apportées ?
8. La différence et la portée des verrous statiques et non statiques synchronisés.
9. Volatil peut-il garantir la sécurité des fils ? Qu'est-ce que ça fait sur DCL ?
10. Quelle est la différence entre volatile et synchronisé ?
11. Qu'est-ce qu'un thread démon ? Comment quitter un fil de discussion ?
12. La différence entre sleep, wait et yield. Comment le thread d'attente le réveille-t-il ?
13. Le sommeil est-il interrompu ?
14. Cycle de vie du fil.
15. Qu'est-ce que ThreadLocal ?
16. Principes de base du pool de threads.
Il y a trois threads T1, T2 et T3 Comment s'assurer qu'ils sont exécutés dans l'ordre ?
Maison Java javaDidacticiel Quels sont les points de connaissances pertinents sur les questions d'entretien du fil Java ?

Quels sont les points de connaissances pertinents sur les questions d'entretien du fil Java ?

Apr 23, 2023 pm 11:07 PM
java

Quels sont les points de connaissances pertinents sur les questions dentretien du fil Java ?

1. Quelle est la différence entre les méthodes ordinaires modifiées synchronisées et les méthodes statiques ? Qu'est-ce que la visibilité ?

Les verrous d'objet sont utilisés pour les méthodes d'instance d'objet, ou une instance d'objet, et les verrous de classe sont utilisés pour les méthodes statiques d'une classe ou les objets de classe d'une classe. Nous savons qu'il peut y avoir plusieurs instances d'objet d'une classe, mais chaque classe n'a qu'un seul objet de classe, donc les verrous d'objet des différentes instances d'objet n'interfèrent pas les uns avec les autres, mais il n'y a qu'un seul verrou de classe pour chaque classe.
Une chose à noter est qu'en fait, le verrouillage de classe n'est qu'une chose conceptuelle et n'existe pas réellement. Le verrouillage de classe verrouille réellement l'objet de classe correspondant à chaque classe. Les verrous de classe et les verrous d’objet n’interfèrent pas non plus les uns avec les autres.
La visibilité signifie que lorsque plusieurs threads accèdent à la même variable, si un thread modifie la valeur de la variable, les autres threads peuvent immédiatement voir la valeur modifiée.
Puisque toutes les opérations sur les variables par les threads doivent être effectuées dans la mémoire de travail et ne peuvent pas directement lire et écrire des variables dans la mémoire principale, alors pour les variables partagées V, elles sont d'abord dans leur propre mémoire de travail puis synchronisées avec la mémoire principale. Cependant, il ne sera pas vidé dans la mémoire principale à temps, mais il y aura un certain décalage horaire. Évidemment, à ce stade, l'opération du thread A sur la variable V n'est plus visible pour le thread B.
Pour résoudre le problème de visibilité des objets partagés, on peut utiliser le mot clé volatile ou le verrou.

2. Quelles sont les catégories de cadenas ?

Quels sont les points de connaissances pertinents sur les questions dentretien du fil Java ?

3. Le principe de la programmation sans verrouillage CAS.

Les processeurs actuels supportent essentiellement l'instruction CAS(), mais les algorithmes implémentés par chaque fabricant sont différents. Chaque processus de fonctionnement CAS contient trois opérateurs : une adresse mémoire V, une valeur attendue A et une nouvelle valeur B. Pendant le fonctionnement. , si la valeur stockée à cette adresse est égale à la valeur attendue A, alors la valeur à l'adresse est affectée à la nouvelle valeur B, sinon aucune opération n'est effectuée.
L'idée de base de CAS est que si la valeur à cette adresse est égale à la valeur attendue, donnez-lui une nouvelle valeur. Sinon, ne faites que renvoyer la valeur d'origine. Loop CAS consiste à effectuer en continu des opérations cas dans une boucle jusqu'à ce qu'elle réussisse. On peut également parler de trois problèmes majeurs avec CAS.

4. Principe de mise en œuvre de ReentrantLock.

Un thread peut entrer à plusieurs reprises dans n'importe quel bloc de code synchronisé par un verrou qu'il possède déjà synchronisé et ReentrantLock sont tous deux des verrous réentrants. En termes d'implémentation, chaque fois qu'un thread acquiert un verrou, il détermine si le thread qui acquiert le verrou est lui-même et accumule simplement le compteur. Chaque fois que le verrou est libéré, le compteur est décrémenté jusqu'à ce que la calculatrice revienne à zéro, indiquant que. le fil a été complètement libéré. La couche inférieure est implémentée à l'aide d'AQS dans JUC.

5.Principe AQS.

est le cadre de base utilisé pour créer des verrous ou d'autres composants de synchronisation, tels que ReentrantLock, ReentrantReadWriteLock et CountDownLatch, qui sont implémentés sur la base d'AQS. Il utilise une variable membre int pour représenter l'état de synchronisation et termine le travail de mise en file d'attente des threads d'acquisition de ressources via la file d'attente FIFO intégrée. Il s'agit d'une variante d'implémentation du verrou de file d'attente CLH. Il peut réaliser 2 méthodes de synchronisation : exclusive et partagée.
La principale façon d'utiliser AQS est l'héritage. Les sous-classes gèrent l'état de synchronisation en héritant d'AQS et en implémentant ses méthodes abstraites. La conception du synchroniseur est basée sur le modèle de méthode modèle, donc si nous voulons implémenter notre propre classe d'outils de synchronisation, nous en avons besoin. pour couvrir plusieurs d'entre elles, telles que tryAcquire, tryReleaseShared, etc.
Le but de cette conception est que les composants de synchronisation (tels que les verrous) sont orientés utilisateur. Elle définit l'interface permettant aux utilisateurs d'interagir avec les composants de synchronisation (par exemple, en permettant à deux threads d'accéder en parallèle), en masquant les détails d'implémentation du synchroniseur ; est pour L'implémenteur de verrous simplifie la mise en œuvre des verrous et protège les opérations sous-jacentes telles que la gestion de l'état de synchronisation, la mise en file d'attente des threads, l'attente et le réveil. Cela isole efficacement les domaines sur lesquels les utilisateurs et les responsables de la mise en œuvre doivent se concentrer.
En interne, AQS maintient un état de ressource partagé et utilise le FIFO intégré pour terminer le travail de mise en file d'attente des threads d'acquisition de ressources. La file d'attente est composée de nœuds Node un par un. Chaque nœud Node conserve une référence précédente et une référence suivante, qui pointent respectivement vers ses propres nœuds prédécesseur et successeur, formant une liste doublement liée à deux extrémités.

6. Le principe de Synchronized et la différence avec ReentrantLock.

principe de (ce) synchronisation : implique deux instructions : Monitorenter, Monitorexit ; parlons de la méthode de synchronisation. À en juger par les résultats de décompilation de la méthode de synchronisation, la synchronisation de la méthode n'est pas obtenue via les instructions Monitorenter et Monitorexit. la méthode ordinaire, son Il existe un identifiant ACC_SYNCHRONIZED supplémentaire dans le pool de constantes.
La JVM implémente la synchronisation des méthodes basée sur cet identifiant : lorsque la méthode est appelée, l'instruction appelante vérifiera si l'indicateur d'accès ACC_SYNCHRONIZED de la méthode est défini. S'il est défini, le thread d'exécution obtiendra d'abord le moniteur, puis s'exécutera. une fois l'acquisition réussie. Corps de la méthode, le moniteur est libéré une fois la méthode exécutée. Pendant l’exécution de la méthode, aucun autre thread ne peut à nouveau obtenir le même objet moniteur.

7. Quelles optimisations Synchronized a-t-il apportées ?

Introduction de technologies telles que le verrouillage par rotation, le verrouillage par rotation adaptatif, l'élimination du verrouillage, le grossissement du verrouillage, le verrouillage biaisé, le verrouillage léger, l'analyse d'échappement et d'autres technologies pour réduire le coût des opérations de verrouillage.

  • Escape Analysis : S'il est prouvé qu'un objet ne s'échappera pas d'une méthode ou d'un thread, cette variable peut être optimisée :

  • Synchronization Elimination : synchronisation Elimination, si un objet ne s'échappera pas un thread , alors les mesures de synchronisation pour cette variable peuvent être éliminées.

  • Élimination des verrous et élimination grossière des verrous : Si le compilateur d'exécution de la machine virtuelle détecte qu'il est peu probable qu'une concurrence de données partagées se produise sur un code nécessitant une synchronisation au moment de l'exécution, il supprimera ces verrous.

  • Verrouillage grossier : fusionnez les blocs de code adjacents avec le même verrou. L'élimination de l'acquisition et de la libération de verrous inutiles peut améliorer les performances d'exécution du programme.

8. La différence et la portée des verrous statiques et non statiques synchronisés.

Les verrous d'objet sont utilisés sur les méthodes d'instance d'objet ou sur une instance d'objet. Les verrous de classe sont utilisés sur les méthodes statiques d'une classe ou sur les objets de classe d'une classe. Nous savons qu'il peut y avoir plusieurs instances d'objet d'une classe, mais chaque classe n'a qu'un seul objet de classe, donc les verrous d'objet des différentes instances d'objet n'interfèrent pas les uns avec les autres, mais il n'y a qu'un seul verrou de classe pour chaque classe.
Une chose à noter est qu'en fait, le verrouillage de classe n'est qu'une chose conceptuelle et n'existe pas réellement. Le verrouillage de classe verrouille réellement l'objet de classe correspondant à chaque classe. Les verrous de classe et les verrous d’objet n’interfèrent pas non plus les uns avec les autres.

9. Volatil peut-il garantir la sécurité des fils ? Qu'est-ce que ça fait sur DCL ?

Il n'y a aucune garantie que le rôle de DCL soit : volatile assurera la visibilité et l'ordre des variables modifiées, garantissant qu'en mode singleton, l'ordre d'exécution lors de la création d'un objet doit être

  1. allocation d'espace mémoire

  2. Instanciez l'instance d'objet

  3. Pointez la référence de l'instance vers l'espace mémoire alloué. À ce moment, l'instance a une adresse mémoire et n'est plus nulle. Cela garantit que l'instance est nulle ou déjà un objet entièrement initialisé.

10. Quelle est la différence entre volatile et synchronisé ?

volatile est le mécanisme de synchronisation le plus léger. Volatile garantit la visibilité lorsque différents threads opèrent sur cette variable. Autrement dit, si un thread modifie la valeur d'une variable, la nouvelle valeur est immédiatement visible par les autres threads. Cependant, volatile ne peut pas garantir l'atomicité des opérations, donc les opérations d'écriture composites sous multi-threads entraîneront des problèmes de sécurité des threads.
Le mot-clé synchronisé peut être utilisé pour modifier des méthodes ou sous forme de blocs synchronisés. Il garantit principalement que plusieurs threads ne peuvent avoir qu'un seul thread dans une méthode ou un bloc synchronisé en même temps. Il assure la visibilité de l'accès des threads aux variables. et exclusivité, également connu sous le nom de mécanismes de verrouillage intégrés.

11. Qu'est-ce qu'un thread démon ? Comment quitter un fil de discussion ?

Le thread Daemon est un thread de support car il est principalement utilisé pour la planification en arrière-plan et le travail de support dans le programme. Cela signifie que lorsqu'il n'y a aucun thread non démon dans une machine virtuelle Java, la machine virtuelle Java se ferme. Un thread peut être défini comme thread démon en appelant Thread.setDaemon (true). Nous ne l'utilisons généralement pas. Par exemple, le thread de récupération de place est le thread Daemon.
        Suspension du fil de discussion  : soit l'exécution de l'exécution est terminée, soit une exception non gérée est levée, entraînant la fin prématurée du fil de discussion. Les API correspondant au thread Thread pour suspendre, reprendre et arrêter les opérations sont suspend(), Ensure() et stop(). Cependant, ces API sont obsolètes et leur utilisation n’est pas recommandée. Parce que cela entraînera le fonctionnement du programme dans un état incertain.其他 La suspension de la sécurité est que d'autres threads interrompent l'opération d'interruption en appelant la méthode interruption () d'un thread A, et le thread interrompu doit déterminer s'il est interrompu par le thread via le thread par la méthode Thread.interrupted(. ) est utilisé pour déterminer si le thread actuel est interrompu, mais Thread.interrupted() réécrira également le bit de l'indicateur d'interruption sur false.

12. La différence entre sleep, wait et yield. Comment le thread d'attente le réveille-t-il ?

Méthode yield() : fait que le thread actuel abandonne la propriété du processeur, mais le moment de l'abandon ne peut pas être défini. La ressource de verrouillage ne sera pas libérée. Tous les threads exécutant rendement() peuvent être à nouveau sélectionnés par le système d'exploitation et exécutés immédiatement après être entrés dans l'état prêt.
Après l'appel de rendement() et sleep(), le verrou détenu par le thread actuel ne sera pas libéré.
Après avoir appelé la méthode wait(), le verrou détenu par le thread actuel sera libéré, et une fois le thread actuel réveillé, il entrera à nouveau en compétition pour le verrou. Le code derrière la méthode wait ne sera exécuté qu'une fois le verrou terminé. concouru.
Wait est généralement utilisé pour l'interaction entre les threads, sleep est généralement utilisé pour suspendre l'exécution et la méthode rendement() amène le thread actuel à abandonner la propriété du processeur.
Le fil d'attente utilise notify/notifyAll() pour se réveiller.

13. Le sommeil est-il interrompu ?

sleep lui-même prend en charge les interruptions. Si le thread est interrompu pendant le sommeil, une exception d'interruption sera levée.

14. Cycle de vie du fil.

Le statut des threads en Java est divisé en 6 types :

  1. Initial (NOUVEAU) : Un nouvel objet thread est créé, mais la méthode start() n'a pas encore été appelée.

  2. Exécuter (RUNNABLE) : Dans les threads Java, les deux états prêt et en cours d'exécution sont généralement appelés "en cours d'exécution". Une fois l'objet thread créé, d'autres threads (tels que le thread principal) appellent la méthode start() de l'objet. Le thread dans cet état se trouve dans le pool de threads exécutables, en attente d'être sélectionné par la planification des threads pour obtenir le droit d'utiliser le CPU. Il est actuellement dans l'état prêt. Le thread à l'état prêt passe à l'état d'exécution (running) après avoir obtenu la tranche de temps CPU.

  3. BLOCKED : Indique que le fil est bloqué dans le verrou.

  4. Waiting (WAITING) : Le thread entrant dans cet état doit attendre que d'autres threads effectuent certaines actions spécifiques (notification ou interruption).

  5. Timeout wait (TIMED_WAITING) : Cet état est différent de WAITING, il peut revenir tout seul après le temps spécifié.

  6. TERMINATED : indique que le thread a terminé son exécution.

Quels sont les points de connaissances pertinents sur les questions dentretien du fil Java ?

15. Qu'est-ce que ThreadLocal ?

ThreadLocal est une variable spéciale en Java. ThreadLocal fournit une copie de la variable pour chaque thread, afin que chaque thread n'accède pas au même objet à un certain moment, isolant ainsi le partage de données par plusieurs threads.
En termes d'implémentation interne, chaque thread contient un ThreadLocalMap, qui est utilisé pour enregistrer une copie des variables appartenant à chaque thread.

16. Principes de base du pool de threads.

Pendant le processus de développement, l'utilisation rationnelle des pools de threads peut apporter 3 avantages.
Premièrement : réduire la consommation de ressources.
Deuxièmement : Améliorez la vitesse de réponse.
Troisièmement : Améliorez la gestion des threads.

  1. Si les threads en cours d'exécution sont inférieurs à corePoolSize, créez un nouveau thread pour effectuer la tâche (notez que l'exécution de cette étape nécessite l'acquisition d'un verrou global).

  2. Si les threads en cours d'exécution sont égaux ou supérieurs à corePoolSize, ajoutez la tâche à BlockingQueue.

  3. Si la tâche ne peut pas être ajoutée à BlockingQueue (la file d'attente est pleine), créez un nouveau fil pour traiter la tâche.

  4. Si la création d'un nouveau thread entraîne un dépassement du thread en cours d'exécution maximumPoolSize, la tâche sera rejetée et la méthode RejectedExecutionHandler.rejectedExecution() sera appelée.

Il y a trois threads T1, T2 et T3 Comment s'assurer qu'ils sont exécutés dans l'ordre ?

Peut être implémenté en utilisant la méthode join.

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!

Déclaration de ce site Web
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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Nombre parfait en Java Nombre parfait en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre parfait en Java. Nous discutons ici de la définition, comment vérifier le nombre parfait en Java ?, des exemples d'implémentation de code.

Weka en Java Weka en Java Aug 30, 2024 pm 04:28 PM

Guide de Weka en Java. Nous discutons ici de l'introduction, de la façon d'utiliser Weka Java, du type de plate-forme et des avantages avec des exemples.

Numéro de Smith en Java Numéro de Smith en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

Questions d'entretien chez Java Spring Questions d'entretien chez Java Spring Aug 30, 2024 pm 04:29 PM

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Horodatage à ce jour en Java Horodatage à ce jour en Java Aug 30, 2024 pm 04:28 PM

Guide de TimeStamp to Date en Java. Ici, nous discutons également de l'introduction et de la façon de convertir l'horodatage en date en Java avec des exemples.

Programme Java pour trouver le volume de la capsule Programme Java pour trouver le volume de la capsule Feb 07, 2025 am 11:37 AM

Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4

PHP vs Python: comprendre les différences PHP vs Python: comprendre les différences Apr 11, 2025 am 12:15 AM

PHP et Python ont chacun leurs propres avantages, et le choix doit être basé sur les exigences du projet. 1.Php convient au développement Web, avec une syntaxe simple et une efficacité d'exécution élevée. 2. Python convient à la science des données et à l'apprentissage automatique, avec une syntaxe concise et des bibliothèques riches.

See all articles