Que signifie ce code java? Va-t-il verrouiller tous les objets de MyClass
?
synchronized(MyClass.class) {
//is all objects of MyClass are thread-safe now ??
}
Et en quoi le code ci-dessus diffère de celui-ci:
synchronized(this) {
//is all objects of MyClass are thread-safe now ??
}
java
multithreading
synchronization
locking
synchronized
Andrew Tobilko
la source
la source
Réponses:
L'extrait de code
synchronized(X.class)
utilise l'instance de classe comme moniteur. Comme il n'y a qu'une seule instance de classe (l'objet représentant les métadonnées de classe au moment de l'exécution), un thread peut être dans ce bloc.Avec
synchronized(this)
le bloc est gardé par l'instance. Pour chaque instance, un seul thread peut entrer dans le bloc.synchronized(X.class)
est utilisé pour s'assurer qu'il y a exactement un thread dans le bloc.synchronized(this)
garantit qu'il y a exactement un thread par instance. Si cela rend le code réel dans le bloc thread-safe dépend de l'implémentation. Si mutate, seul l'état de l'instancesynchronized(this)
est suffisant.la source
Pour ajouter aux autres réponses:
est équivalent à
et
est équivalent à
la source
synchronized
blocs. Cela les rend équivalents. Si vous changez un exemple, ils ne sont en effet plus les mêmes.Non, le premier obtiendra un verrou sur la définition de classe de
MyClass
, pas toutes ses instances. Cependant, s'il est utilisé dans une instance, cela bloquera efficacement toutes les autres instances, car elles partagent une seule définition de classe.Le second obtiendra un verrou sur l'instance actuelle uniquement.
Quant à savoir si cela rend vos objets thread-safe, c'est une question beaucoup plus complexe - nous aurions besoin de voir votre code!
la source
Oui, il le fera (sur n'importe quel bloc / fonction synchronisé).
Je me posais des questions sur cette question pendant quelques jours pour moi-même (en fait à kotlin). J'ai enfin trouvé une bonne explication et je souhaite la partager:
Le verrouillage de niveau de classe empêche plusieurs threads d'entrer en bloc synchronisé dans l'une de toutes les instances disponibles de la classe au moment de l'exécution. Cela signifie que si au moment de l'exécution il y a 100 instances de DemoClass, alors un seul thread sera capable d'exécuter demoMethod () dans n'importe quelle instance à la fois, et toutes les autres instances seront verrouillées pour les autres threads.
Le verrouillage au niveau de la classe doit toujours être effectué pour sécuriser les threads de données statiques. Comme nous savons que les mots-clés statiques associent les données des méthodes au niveau de la classe, utilisez donc le verrouillage au niveau des champs ou des méthodes statiques pour le rendre au niveau de la classe.
De plus, pour savoir pourquoi .class . C'est juste parce qu'elle
.class
équivaut à toute variable statique de classe similaire à:où le nom de la variable de verrouillage est la classe et le type est la classe <T>
En savoir plus: https://howtodoinjava.com/java/multi-threading/object-vs-class-level-locking/
la source