10
votes

"Synchronisé (this)" vs "Synchronisé ((basoclass) ceci)" en Java?

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();
          }
     }
}


0 commentaires

4 Réponses :


2
votes

Les trois exemples sont corrects en ce qui concerne la synchronisation.

  1. Il n'y a qu'un seul moniteur associé à n'importe quel objet.
  2. casting ceci à une classe de base à l'intérieur synchronisé ne fait aucune différence.
  3. pour le même objet, peu importe si synchronisé (this) 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.

1 commentaires

Merci pour votre réponse rapide et me rappelez-vous qu'il n'y a qu'un seul moniteur avec n'importe quel objet.



6
votes

Le code est thread-coffre-fort, car (quelqueObject) Ce ADN Ce est le même objet. Une distribution ne transforme pas un objet en un autre objet.

Le code manque d'encapsulation, cependant, car il permet à toute sous-classe d'accéder au champ Protégé C de manière non synthétique. Ainsi, toute sous-classe peut utiliser C ++ ou c - sans aucune synchronisation. Le champ devrait être privé.


1 commentaires

Merci de me rappeler que le compteur "c" devrait être déclaré "privé".



3
votes

Il me semble que "(SuperClassa) Ceci" n'est pas égal à "ceci"

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.

Ainsi, vous n'avez pas besoin d'ajouter une synchronisation supplémentaire dans la sous-classe.


1 commentaires

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



5
votes

Le compteur "C" serait-il accessible sur le thread en sécurité?

Oui, il utilise le même objet de verrouillage.

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é?

oui.

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")

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.

[...] mais il semble que ce bloc aussi ajouté n'est pas élégant et peut être redondant!

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.


0 commentaires