


Une brève introduction aux mots-clés multithread Java volatile, lock et synchronisé
Cet article vous apporte une brève introduction aux mots-clés multi-thread Java volatile, lock et synchronisé. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il vous sera utile. .
1. Volatile
Sémantique de la mémoire de l'écriture volatile et de la lecture volatile :
Le thread A écrit une variable volatile, qui est essentiellement le thread A écrivant dans la mémoire qui sera lu ensuite. Un thread de cette variable volatile a émis un message (qui a modifié la variable partagée). Lorsque le thread B lit une variable volatile, en substance, le thread B reçoit un message envoyé par un thread précédent (modifications de la variable partagée avant d'écrire la variable volatile). Le thread A écrit une variable volatile, puis le thread B lit la variable volatile. Ce processus est essentiellement le thread A qui envoie un message au thread B via la mémoire principale.
Sémantique de la mémoire de libération et d'acquisition du verrou :
Le thread A libère un verrou En substance, le thread A envoie un message à un thread qui acquerra ensuite le verrou (le thread A a un verrou partagé). Message de modification de variable). Le thread B acquiert un verrou. Essentiellement, le thread B reçoit un message envoyé par un thread précédent (modifications des variables partagées avant de libérer le verrou). Le thread A libère le verrou, puis le thread B acquiert le verrou. Ce processus consiste essentiellement pour le thread A à envoyer un message au thread B via la mémoire principale.
Résumé : le rôle du mot-clé volatile est de rendre les variables visibles (visibles) sur plusieurs threads, mais volatile à lui seul ne peut pas garantir la sécurité des threads. Le mot-clé volatile n'a pas le mot-clé synchronisé.
2. lock
Lock est une interface :
public interface Lock { void lock(); void lockInterruptibly() throws InterruptedException; boolean tryLock(); boolean tryLock(long time, TimeUnit unit) throws InterruptedException; void unlock(); Condition newCondition(); }
lock(), tryLock(), tryLock(long time, TimeUnit unit) et lockInterruptably() sont Utilisé pour acquérir des serrures.
La méthode unLock() est utilisée pour libérer le verrou. La méthode tryLock() a une valeur de retour, ce qui signifie qu'elle est utilisée pour tenter d'acquérir le verrou. Si l'acquisition réussit, elle renvoie vrai. Si l'acquisition échoue (c'est-à-dire que le verrou a été acquis par un autre thread), il renvoie false, ce qui signifie que cette méthode reviendra quoi qu'il arrive immédiatement. Vous n'attendrez pas là-bas si vous ne parvenez pas à obtenir la serrure. La méthode tryLock (long time, TimeUnit unit) est similaire à la méthode tryLock (), mais la différence est que cette méthode attendra un certain temps pendant laquelle elle ne pourra pas obtenir le verrou si elle ne peut pas obtenir le verrou dans le délai imparti. limite, il retournera false. Renvoie vrai si le verrou a été obtenu initialement ou pendant la période d'attente. La méthode lockInterruptably() est spéciale. Lors de l'acquisition d'un verrou via cette méthode, si le thread attend d'acquérir le verrou, le thread peut répondre à l'interruption, c'est-à-dire interrompre l'état d'attente du thread. C'est-à-dire que lorsque deux threads veulent acquérir un verrou via lock.lockInterruptably() en même temps, si le thread A acquiert le verrou à ce moment-là et que le thread B attend seulement, alors la méthode threadB.interrupt() est appelé sur le thread B. Peut interrompre le processus d'attente du thread B.
Le verrouillage peut être interrompu pendant le processus d'acquisition du verrouillage. lock peut essayer d'acquérir le verrou si le verrou est détenu par un autre thread, il renvoie false et ne met pas le thread actuel en veille. Lorsque le verrou tente d'acquérir le verrou, il transmet un paramètre de temps. Si le verrou n'est pas acquis dans cet intervalle de temps, la demande est terminée. synchronisé libérera automatiquement le verrou, mais le verrouillage ne libérera pas automatiquement le verrou. Remarque : lock() peut être utilisé pour verrouiller un morceau de code, de sorte qu'un autre code doit attendre avant que le verrou ne soit libéré. Il convient de noter que le verrou ne libérera pas automatiquement le verrou comme c'est le cas avec une synchronisation, il doit donc être placé dans un fichier. try-finally block , en vous assurant que le verrou est libéré.
Lock et synchronisé présentent les différences suivantes :
1) Lock est une interface, tandis que synchronisé est un mot-clé en Java, et synchronisé est une implémentation de langage intégrée
2) Lorsqu'une exception se produit, synchronisé libérera automatiquement le verrou occupé par le thread, donc cela ne provoquera pas de blocage, tandis que lorsqu'une exception se produit, si Lock ne libère pas activement le verrou via unLock(), il est probable qu'il le soit. provoquer un blocage. , donc lorsque vous utilisez Lock, vous devez libérer le verrou dans le bloc final 3) Lock peut permettre au thread en attente du verrou de répondre à l'interruption, mais synchronisé ne peut pas le faire. synchronisé, le thread en attente attendra indéfiniment et ne pourra pas répondre à l'interruption ; 4) Grâce au verrouillage, vous pouvez savoir si le verrou a été acquis avec succès, mais synchronisé ne peut pas le faire. 5) Le verrouillage peut améliorer l'efficacité des opérations de lecture de plusieurs threads. En termes de performances, si la concurrence pour les ressources n'est pas féroce, les performances des deux sont presque les mêmes. Lorsque la concurrence pour les ressources est très féroce (c'est-à-dire qu'il y a un grand nombre de threads en concurrence en même temps), les performances de Lock sont bien meilleures que celles de synchronisé. Par conséquent, il doit être sélectionné en fonction de la situation appropriée lors de son utilisation. ReentrantLock signifie « verrouillage réentrant ». Le concept de verrouillage réentrant est décrit dans la section suivante. ReentrantLock est la seule classe qui implémente l'interface Lock et ReentrantLock fournit plus de méthodes. 3. synchronisé 1. Lorsque deux threads simultanés accèdent au bloc de code de synchronisation synchronisé (ce) dans le même objet, un seul thread peut être exécuté à la fois. Un autre thread doit attendre que le thread actuel ait fini d'exécuter ce bloc de code avant de pouvoir exécuter ce bloc de code.2. Cependant, lorsqu'un thread accède à un bloc de code synchronisé (this) d'un objet, un autre thread peut toujours accéder au bloc de code synchronisé non synchronisé (this) dans l'objet.
3. Ce qui est particulièrement important est que lorsqu'un thread accède à un bloc de code synchronisé (ceci) d'un objet, les autres threads ne pourront pas accéder à tous les autres blocs de code synchronisés (ceci) de l'objet.
4. Le troisième exemple est également applicable à d'autres blocs de codes de synchronisation. C'est-à-dire que lorsqu'un thread accède à un bloc de code synchronisé d'un objet, il obtient le verrou d'objet de cet objet. En conséquence, l'accès des autres threads à toutes les parties de code synchronisées de l'objet objet est temporairement bloqué. Portée du mot-clé synchronisé : au sein d'une instance d'objet, synchronisé aMethod(){} peut empêcher plusieurs threads d'accéder à la méthode synchronisée de cet objet en même temps (si un objet a plusieurs méthodes synchronisées, à condition qu'un thread accède à l'une des la méthode des méthodes synchronisées, les autres threads ne peuvent accéder simultanément à aucune méthode synchronisée dans cet objet). À l’heure actuelle, les méthodes synchronisées des différentes instances d’objet n’interfèrent pas les unes avec les autres. En d'autres termes, d'autres threads peuvent toujours accéder à la méthode synchronisée dans une autre instance d'objet de la même classe en même temps ; dans la portée d'une certaine classe, la méthode statique synchronisée aStaticMethod{} empêche plusieurs threads d'accéder à la méthode statique synchronisée dans cette classe. en même temps. Cela fonctionne sur toutes les instances d'objet de la classe.
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!

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

Dans le développement Java, la lecture de fichiers est une opération très courante et importante. À mesure que votre entreprise se développe, la taille et le nombre de fichiers évoluent également. Afin d'augmenter la vitesse de lecture des fichiers, nous pouvons utiliser le multi-threading pour lire les fichiers en parallèle. Cet article explique comment optimiser les performances d'accélération multithread de lecture de fichiers dans le développement Java. Tout d’abord, avant de lire le fichier, nous devons déterminer la taille et la quantité du fichier. En fonction de la taille et du nombre de fichiers, nous pouvons définir le nombre de threads de manière raisonnable. Un nombre excessif de threads peut entraîner un gaspillage de ressources,

Explication détaillée du rôle et des scénarios d'application du mot-clé volatile en Java 1. Le rôle du mot-clé volatile En Java, le mot-clé volatile est utilisé pour identifier une variable visible entre plusieurs threads, c'est-à-dire pour assurer la visibilité. Plus précisément, lorsqu'une variable est déclarée volatile, toute modification apportée à la variable est immédiatement connue des autres threads. 2. Scénarios d'application de l'indicateur d'état de mot clé volatile Le mot clé volatile convient à certains scénarios d'indicateur d'état, tels qu'un

Explorez les principes de fonctionnement et les caractéristiques du multithreading Java Introduction : Dans les systèmes informatiques modernes, le multithreading est devenu une méthode courante de traitement simultané. En tant que langage de programmation puissant, Java fournit un mécanisme multithread riche, permettant aux programmeurs de mieux utiliser le processeur multicœur de l'ordinateur et d'améliorer l'efficacité de l'exécution des programmes. Cet article explorera les principes de fonctionnement et les caractéristiques du multithreading Java et l'illustrera avec des exemples de code spécifiques. 1. Le concept de base du multi-threading Le multithreading fait référence à l'exécution de plusieurs threads en même temps dans un programme, et chaque thread traite différents

Réponses de la technologie de débogage multithread : 1. Défis du débogage de code multithread : L'interaction entre les threads conduit à un comportement complexe et difficile à suivre. 2. Technologie de débogage multithread Java : vidage de thread de débogage ligne par ligne (jstack) surveille les événements d'entrée et de sortie variables locales de thread 3. Cas pratique : utilisez le vidage de thread pour trouver une impasse, utilisez les événements de surveillance pour déterminer la cause de l'impasse. 4. Conclusion : La technologie de débogage multithread fournie par Java peut résoudre efficacement les problèmes liés à la sécurité des threads, aux blocages et aux conflits.

Le Guide d'optimisation des performances multithreading Java fournit cinq points d'optimisation clés : Réduire la surcharge de création et de destruction des threads Éviter les conflits de verrouillage inappropriés Utiliser des structures de données non bloquantes Tirer parti des relations Happens-Before Envisager des algorithmes parallèles sans verrouillage

Points clés de la gestion des exceptions dans un environnement multithread : Capture des exceptions : chaque thread utilise un bloc try-catch pour intercepter les exceptions. Gérer les exceptions : imprimez les informations sur les erreurs ou effectuez une logique de gestion des erreurs dans le bloc catch. Terminez le thread : lorsque la récupération est impossible, appelez Thread.stop() pour terminer le thread. UncaughtExceptionHandler : pour gérer les exceptions non interceptées, vous devez implémenter cette interface et l'attribuer au thread. Cas pratique : gestion des exceptions dans le pool de threads, en utilisant UncaughtExceptionHandler pour gérer les exceptions non interceptées.

Le mécanisme de verrouillage de concurrence Java garantit que les ressources partagées sont accessibles par un seul thread dans un environnement multithread. Ses types incluent le verrouillage pessimiste (acquérir le verrou puis accéder) et le verrouillage optimiste (vérifier les conflits après l'accès). Java fournit des classes de verrouillage de concurrence intégrées telles que ReentrantLock (verrouillage mutex), Semaphore (sémaphore) et ReadWriteLock (verrouillage en lecture-écriture). L'utilisation de ces verrous peut garantir un accès sécurisé aux ressources partagées, par exemple en garantissant que lorsque plusieurs threads accèdent au compteur de variable partagée en même temps, un seul thread met à jour sa valeur.

Java est un langage de programmation largement utilisé dans le développement de logiciels modernes, et ses capacités de programmation multithread constituent également l'un de ses plus grands avantages. Cependant, en raison des problèmes d'accès simultanés causés par le multithreading, des problèmes de sécurité multithread surviennent souvent en Java. Parmi eux, java.lang.ThreadDeath est un problème de sécurité multithread typique. Cet article présentera les causes et les solutions de java.lang.ThreadDeath. 1. Raisons de java.lang.ThreadDeath
