Ceci est un successeur de ma question précédente, est-ce La variable est accessible en toute sécurité à l'aide de la synchronisation?
pour le programme suivant, P>
Class SubClassB extends SuperClassA { public void inc() { synchronized (this) { c++; } } public void dec() { synchronized (this) { super.dec(); } } }
4 Réponses :
Les trois exemples sont corrects en ce qui concerne la synchronisation. P>
ceci code> à une classe de base à l'intérieur synchronisé code> ne fait aucune différence. li>
- pour le même objet, peu importe si
synchronisé (this) code> est invoqué dans le contexte de la classe dérivée ou de la classe de base: le même verrou est utilisé dans les deux cas. li>
ol>
Merci pour votre réponse rapide et me rappelez-vous qu'il n'y a qu'un seul moniteur avec n'importe quel objet.
Le code est thread-coffre-fort, car Le code manque d'encapsulation, cependant, car il permet à toute sous-classe d'accéder au champ Protégé (quelqueObject) Ce code> ADN
Ce code> est le même objet. Une distribution ne transforme pas un objet en un autre objet. P>
C code> de manière non synthétique. Ainsi, toute sous-classe peut utiliser
C ++ code> ou
c - code> sans aucune synchronisation. Le champ devrait être privé. P>
Merci de me rappeler que le compteur "c" devrait être déclaré "privé".
Il me semble que "(SuperClassa) Ceci" n'est pas égal à "ceci" p> blockQuote>
faux; La synchronisation est effectuée sur des objets et la coulée ne modifie que le type de temps de compilation, est sans effet sur l'identité de l'objet. P>
Ainsi, vous n'avez pas besoin d'ajouter une synchronisation supplémentaire dans la sous-classe. P>
Maintenant, je sais que "(SuperClassa) Ceci" et "Ceci" sont de type de temps de compilation différent mais contiennent la même serrure en bloc synchronisé.
Le compteur "C" serait-il accessible sur le thread en sécurité? P> blockQuote>
Oui, il utilise le même objet de verrouillage. P>
Je ne suis pas sûr que dans la méthode "DEC ()", c'est la superclassa casting "Ceci" référence un objet valide pour le bloc synchronisé? P> blockQuote>
oui. p>
Si oui, les deux blocs synchronisés seraient-ils verrouillés le même objet "Cet objet"? (Comme il me semble que "(Superclassa), cela" n'est pas égal à "this") p> blockQuote>
Oui. Même si vous lancez l'instance à quelque chose, il peut être coulé à (même objet), cela fera toujours référence au même objet. P>
[...] mais il semble que ce bloc aussi ajouté n'est pas élégant et peut être redondant! P> blockQuote>
Il est redondant. Une synchronisation supplémentaire n'est requise que si vous appelez plusieurs méthodes synchronisées et que l'effet combiné doit être atomique. P>