Lock est une interface, et l'implémentation la plus couramment utilisée est ReentrantLock. L'une de ses flexibilités est qu'elle peut définir le paramètre fair.
ReentrantLock avec synchronisé et fair=false ne peut pas déterminer l'ordre de verrouillage. En d'autres termes, les threads A, B et C verrouillent tous l'objet. La première fois qu'ils tentent de verrouiller, c'est A, puis B et enfin C. Ensuite, lorsque A déverrouille l'objet, il ne peut pas être déterminé si B ou C va se verrouiller. l'objet ensuite.
Si vous utilisez fair=true ReentrantLock (fair lock), la situation est déterminée : lorsque A déverrouille l'objet, puisque B essaie de verrouiller l'objet avant C, B doit le verrouiller ensuite, et ce n'est que lorsque B déverrouille le tour à C.
new lock1
new lock2
lock1.lock();
lock2.lock();
...
lock2.unlock();
lock1.unlock();
Le verrouillage et le déverrouillage de Lock sont implémentés au niveau sémantique Java, et il n'y a pas de relation nécessaire entre les verrous
synchronized(obj1){
synchronized(obj2){
...
}
}
Le déverrouillage
synchronized est implémenté par la JVM. Il se déverrouillera après l'exécution du bloc synchronized. Tous seront déverrouillés dans l'ordre d'imbrication de synchronized.
Lock est une interface, et l'implémentation la plus couramment utilisée est ReentrantLock. L'une de ses flexibilités est qu'elle peut définir le paramètre fair.
ReentrantLock avec synchronisé et fair=false ne peut pas déterminer l'ordre de verrouillage. En d'autres termes, les threads A, B et C verrouillent tous l'objet. La première fois qu'ils tentent de verrouiller, c'est A, puis B et enfin C. Ensuite, lorsque A déverrouille l'objet, il ne peut pas être déterminé si B ou C va se verrouiller. l'objet ensuite.
Si vous utilisez fair=true ReentrantLock (fair lock), la situation est déterminée : lorsque A déverrouille l'objet, puisque B essaie de verrouiller l'objet avant C, B doit le verrouiller ensuite, et ce n'est que lorsque B déverrouille le tour à C.
Le verrouillage et le déverrouillage de
Le déverrouillageLock
sont implémentés au niveau sémantique Java, et il n'y a pas de relation nécessaire entre les verroussynchronized
est implémenté par la JVM. Il se déverrouillera après l'exécution du blocsynchronized
. Tous seront déverrouillés dans l'ordre d'imbrication desynchronized
.