Java: blocs de synchronisation imbriqués
j'ai vu ça dans un de Heinz Kabutz Spécialiste Java<!-Bien que le reste (et en fait tous les articles) des articles du Dr Kabutz soient bien expliqués et détaillés, il semble avoir passé sous silence ce que fait ce code, ou plus important encore, ce qu'il signifie:
public class SomeObject {
private Object lock1;
private Object lock2;
public void doSomething() {
synchronized(lock1) {
synchronized(lock2) {
// ...
}
}
}
}
Quelles sont les implications de nidification synchronized
blocs? Comment cela affecte-t-il les différents threads essayant de doSomething()
?
3 réponses
il y a 2 problèmes possibles qu'il faudrait surveiller
serrures imbriquées peuvent entraîner des blocages assez facilement si on utilise wait / notify. Voici une explication de pourquoi. http://tutorials.jenkov.com/java-concurrency/nested-monitor-lockout.html
il faut se méfier que si une autre méthode veut verrouiller les mêmes deux objets, ils doivent toujours le faire dans le même ordre, sinon il y a la possibilité de une autre situation d'impasse comme expliqué dans ce post: Comment éviter la synchronisation imbriquée et l'impasse qui en résulte
ce code ne causera aucun problème. Mais le problème peut venir sous la forme d'une impasse s'il y a quelque chose comme CE code; où nous avons deux méthodes avec des blocs synchronisés de telle sorte que les objets sont verrouillés dans des ordres opposés-
public void doSomething() {
synchronized(lock1) {
synchronized(lock2) {
// ...
}
}
}
public void doOtherthing() {
synchronized(lock2) {
synchronized(lock1) {
// ...
}
}
}
maintenant si plus d'un thread essaye d'accéder à ces méthodes alors il peut y avoir une impasse à cause de blocs synchronisés imbriqués.
Selon Tutoriel De Verrouillage Des Moniteurs Imbriqués
verrouillage du moniteur imbriqué, le Thread 1 tient une serrure A, et attend pour un signal de Thread 2. Thread 2 a besoin de la serrure A pour envoyer le signal à Thread 1. Alors que dans l'impasse, deux fils attendent l'un l'autre pour libérer les serrures.
L'impasse pourrait être analogue à deux personnes sont emprisonnés dans deux chambres, ils veulent faire un commutateur à la chambre de l'autre, mais tous les deux seulement avoir la clé de leur homologue. Tout imbriqué moniteur de verrouillage tout comme le patron est disposé à dormir dans une chambre et supposons qu'il sera réveillé que quand quelqu'un vient dans la chambre. Et le secrétaire est chargé de réveiller son patron. Mais le patron tenait toujours la clé de la chambre quand il dormait, donc la secrétaire ne pouvait pas venir le réveiller.