Verrouillage explicite
1. Verrouillage et ReentrantLock
Le verrouillage fournit une opération d'acquisition de verrouillage inconditionnelle, interrogeable, chronométrée et interrompue. Toutes les opérations de verrouillage et les méthodes de déverrouillage sont explicites
ReentrantLock implémente Lock : et fournit la même sémantique de mémoire que synchronisée ; il fournit également une sémantique de verrouillage
réentrant
1. Sémantique de base :
void LockDefinition() {
Lock lock = new ReentrantLock();try {//do someting//更新对象状态,捕获异常;并在必要时恢复不变性条件} finally {//finally中释放锁 lock.unlock();
}
}
2. Verrous d'interrogation et verrous temporisés
lock.tryLock([Long,TimeUnit] ) : Essayez d'acquérir le verrou, et l'heure est un verrou temporisé
3. Opération d'acquisition de verrou disruptif
Lock.lockInterruptably();
2. Équité
ReentrantLock peut créer des verrous équitables (acquisition séquentielle demandée de verrous) et des verrous injustes ( saut de file d'attente possible).
Saut de file d'attente : lorsqu'un thread demande un verrouillage injuste, si l'état du verrou est disponible au moment de la demande, alors le thread ne sera pas mis dans la file d'attente, mais ignorera tous les threads en attente dans le faire la queue et obtenir le verrou ;
Remarque : le verrouillage injuste ne préconise pas le saut de file d'attente, mais il ne peut pas empêcher le saut de file d'attente ; tandis que le verrouillage équitable sera placé dans la file d'attente et exécuté séquentiellement
Le verrouillage injuste est plus rapide que le verrouillage équitable lorsque la concurrence est féroce Rapide : La raison en est qu'il y a un délai important entre la reprise d'un thread dans la file d'attente et le début de son exécution
3. Verrouillage en lecture-écriture
ReentrantLock est un verrou mutex standard, mais dans certains scénarios, tels que : la lecture et la lecture parallèles ne peuvent pas être obtenues
Verrouillage en lecture-écriture ReadWriteLock : implémentez ReentrantReadWriteLock : méthode de verrouillage en lecture readLock et verrouillage en écriture writeLock
1. Méthode d'interaction et d'implémentation
Priorité de libération : lorsqu'un verrou en écriture est libéré et qu'il y a à la fois des lectures et des écritures dans la file d'attente, la lecture, l'écriture ou le thread qui envoie la requête doit-il être donné en premier priorité?
Le fil de lecture saute dans la file d'attente : il y a un verrou d'écriture en attente du verrou de lecture actuel, le verrou de lecture suivant devrait-il donc sauter dans la file d'attente et lire directement ? La lecture directe améliorera la simultanéité mais peut entraîner un manque d'écriture et un échec d'obtention de la
Réentrance : les verrous de lecture et les verrous d'écriture sont-ils réentrants ?
Rétrogradation : Verrouillage en écriture, pouvez-vous acquérir un verrou en lecture sans relâcher le verrou, afin que le verrou du fil puisse être rétrogradé ?
Mise à niveau : le verrou en lecture peut-il être mis à niveau vers un verrou en écriture avant les autres threads en attente ? Si deux threads tentent de mettre à niveau pour écrire des verrous en même temps, il est facile de provoquer un blocage
Applicable à : les structures de données qui lisent principalement les opérations
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!