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(); } }
5 Réponses :
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
Il n'y a qu'une seule instance pour obtenir le verrouillage, l'instance de Le verrou est obtenu lorsque vous appelez loggockwidget code>, il n'y a jamais une instance réelle de
widget code>. p>.
loggockwidget.dosomething () code> et comme vous avez déjà le verrou lorsque vous appelez
super.dosomething () code> Cette méthode est exécutée comme normale . p>
public void doSomething() { synchronized (this) { System.out.println(toString() + ": calling doSomething"); super.doSomething(); } }
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é. P>
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. P>
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.