Le verrouillage est le mécanisme de synchronisation le plus important dans la programmation simultanée Java. Le verrouillage est implémenté en JAVA via le mot-clé Synchronized et les classes associées sous le package java.util.concurrent.
La notion de verrou en Java
Spin lock : signifie que lorsqu'un thread acquiert un verrou, si le verrou a été acquis par un autre thread, alors le thread Attendez en boucle, puis déterminez en permanence si le verrou peut être acquis avec succès. La boucle ne se terminera pas tant que le verrou n'est pas acquis.
Verrouillage optimiste : on suppose qu'il n'y a pas de conflit. Lors de la modification des données, s'il s'avère que les données sont incohérentes avec les données précédemment acquises, lisez les dernières données et réessayez la modification après la modification.
Verrouillage pessimiste : on suppose qu'un conflit de concurrence se produira, synchronisera toutes les opérations associées sur les données et commencera le verrouillage lors de la lecture des données.
Verrouillage exclusif (écriture) : ajoutez un verrou en écriture à la ressource, le thread qui possède le verrou peut modifier la ressource, et les autres threads ne peuvent pas ajouter plus de verrou (écriture unique)
Verrou partagé (lecture) : après avoir ajouté un verrou en lecture à une ressource, il ne peut être lu mais non modifié. Les autres threads ne peuvent ajouter que des verrous en lecture, pas des verrous en écriture (lectures multiples)
Verrouillage réentrant : une fois qu'un thread a obtenu un verrou, il peut entrer librement le code synchronisé avec le même verrou
Verrou non réentrant : une fois qu'un thread a obtenu un verrou, il ne peut pas entrer librement le même code. Le code pour synchroniser le verrou
Verrouillage équitable : l'ordre de compétition pour le verrou est dans l'ordre du premier venez, premier servi
Verrouillage injuste : l'ordre de concourir pour le verrou n'est pas dans l'ordre du premier arrivé, premier servi
Plusieurs méthodes importantes d'implémentation de verrous en Java : synchronized, ReentrantLock, ReentrantReadWriteLock
Mots-clés de synchronisation : synchronized
Portée du verrouillage : Verrouillage d'objet, verrouillage de classe, verrouillage distribué
Fonctionnalités synchronisées : Verrouillage réentrant, exclusif et pessimiste
Optimisation du verrouillage :
L'élimination du verrouillage est une méthode d'optimisation du verrouillage qui se produit au niveau du compilateur. Le compilateur juste-à-temps de la machine nécessite la synchronisation de certains codes pendant l'exécution, mais il est détecté qu'il n'y a pas de compétition de verrouillage pour les données partagées Eliminate (paramètres pour activer l'élimination du verrouillage : -xx:+DoEscapeAnalysis -XX:+EliminateLocks)
Grossissement du verrouillage : dans certains cas, nous souhaitons fusionner de nombreuses demandes de verrouillage en une seule demandeRemarque : le mot-clé synchronisé réalise non seulement la synchronisation, mais JMM stipule que synchronisé doit assurer la visibilité (ne peut pas être mis en cache)
Exemple de code d'utilisation synchronisé :
public class Counter { private static int i = 0; // 等价于 synchronized(this) public synchronized void update() { i++; } public void updateBlock() { synchronized (this) { i++; } } // 等价于 synchronized (Counter.class) public static synchronized void staticUpdate() { i++; } public static void staticUpdateBlock() { synchronized (Counter.class) { i++; } } }
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!