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()?

18
demandé sur zb226 2012-04-28 19:53:39

3 réponses

il y a 2 problèmes possibles qu'il faudrait surveiller

  1. 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

  2. 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

29
répondu Bruce Lowe 2017-05-23 12:02:39

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.

1
répondu infoj 2017-01-29 15:21:55

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.

0
répondu AnnabellChan 2016-12-30 09:39:30