web-dev-qa-db-fra.com

synchronize (this) vs synchronize (MyClass.class)

Duplicata possible:
Bloc synchronisé Java pour .class

Je lisais un article sur la synchronisation. Je suis confus sur les points ci-dessous et j'ai besoin de plus de précisions

1) Pour le bloc de synchronisation. Comment

   synchronize(this){
    // code
   }

diffère de

   synchronize(MyClass.class){
    //code
   }

2) La synchronisation de la méthode d'instance signifie que les threads devront obtenir un verrou exclusif sur l'instance, tandis que la synchronisation de la méthode statique signifie que le thread devra acquérir un verrou sur toute la classe (corrigez-moi si je me trompe). Donc, si une classe a trois méthodes et que l'une d'entre elles est synchronisée statiquement, alors si un thread acquiert un verrou sur cette méthode, cela signifie qu'il acquiert un verrou sur toute la classe. Cela signifie-t-il donc que les deux autres seront également verrouillées et qu'aucune autre méthode ne pourra accéder à ces deux méthodes car toute la classe a un verrou?

26
Sandeep Kumar

MyClass.class et this sont des choses différentes, sont des références différentes à des objets différents.

this - est la référence particulière à cette instance de classe, et

MyClass.class - est la référence à MyClass objet de description.

Ce bloc de synchronisation diffère en ce que le premier synchronisera tous les threads qui traitent concrètement avec cette instance de MyClass, et le second synchronisera tous les threads indépendamment de quel objet sur lequel cette méthode a été appelée.

27
Andremoniy

Le premier exemple (acquisition de verrouillage sur this) est destiné à être utilisé dans les méthodes d'instance, le second (acquisition de verrouillage sur class objet) - dans les méthodes static.

Si un thread acquiert le verrouillage sur MyClass.class, les autres threads devront attendre pour entrer le bloc synchronisé d'une méthode static dans laquelle se trouve ce bloc. Entre-temps, tous les threads pourront acquérir un verrou pour une instance particulière de cette classe et exécuter des méthodes d'instance.

11
Andrew Logvinov