11
votes

Verrouillage réentrant

Un peu d'aide s'il vous plaît, considérez le morceau du code ci-dessous.

public class Widget {
    public synchronized void doSomething() {
        ...
    }
}

public class LoggingWidget extends Widget {
    public synchronized void doSomething() {
        System.out.println(toString() + ": calling doSomething");
        super.doSomething();
    }
}


2 commentaires

Vous devriez poster une référence à l'endroit où vous lisez ceci car ce n'est pas vrai :-)


Merci vraiment pour votre aide. J'ai mal compris l'explication du verrouillage réentrant. Après avoir lu votre explication, je suis retourné à la source (extrait de la concurrence du livre dans la pratique) et cela a du sens maintenant.


5 Réponses :


9
votes

Vous vous trompez - les serrures sont obtenues à l'instance em> niveau. Il n'y a qu'un seul verrou dans votre exemple car il n'y a qu'une seule instance créée lorsque vous dites:

Widget w = new LoggingWidget


0 commentaires

1
votes

Il n'y a qu'une seule instance pour obtenir le verrouillage, l'instance de loggockwidget , il n'y a jamais une instance réelle de widget . .

Le verrou est obtenu lorsque vous appelez loggockwidget.dosomething () et comme vous avez déjà le verrou lorsque vous appelez super.dosomething () Cette méthode est exécutée comme normale .


0 commentaires

5
votes
public void doSomething() {
    synchronized (this) {
        System.out.println(toString() + ": calling doSomething");
        super.doSomething();
    }
}

0 commentaires

1
votes

La réentrancement fonctionne en acquérant d'abord la serrure. Lorsqu'un fil acquiert le verrou, il est connu dans la JVM. Lors de la saisie d'un bloc de code synchronisé avec le fil qui maintient actuellement une serrure, ils sont autorisés à continuer sans acquérir la serrure. Le JVM augmente ensuite un compteur à chaque action réentrante, diminuant davantage lors de la sortie de ce bloc jusqu'à ce que le nombre soit zéro. Lorsque le nombre est zéro, le verrou est libéré. ​​


0 commentaires

0
votes

B.GOETZ - "JJAVA Concurrency dans la pratique" Si les serrures intrinsèques n'étaient pas réentrantes, l'appel à Super.Dosomething ne serait jamais en mesure d'acquérir la serrure car elle serait déjà considérée, et le fil étalant de manière permanente en attente de un verrou, il ne peut jamais acquérir. La réentrance nous évite de l'impasse dans des situations comme celle-ci.


0 commentaires