Comment le locking de niveau de classe est-il acquis?

public synchronized int getCountOne() { return count++; } 

Comme ci-dessus, la synchronisation de code sur le procédé équivaut fonctionnellement à disposer d’un synchronized (this) block autour du corps du procédé. L’object “this” ne devient pas verrouillé, mais “this” est utilisé comme mutex et le corps ne peut pas être exécuté simultanément avec d’autres sections de code également synchronisées sur “this”.

Sur des bases similaires, ce qui est utilisé comme un mutex lorsque nous acquérons un verrou de niveau classe. Comme si nous avions une fonction

 public static synchronized int getCountTwo() { return count++; } 

il est évident que deux threads peuvent simultanément obtenir des verrous sur getCountOne (verrou de niveau object) et getCountTwo (verrou de niveau classe). Donc, comme getCountOne est analogue à

 public int getCountOne() { synchronized(this) { return count++; } } 

Existe-t-il un équivalent de getCountTwo? Si non, quels critères sont utilisés pour obtenir un verrou de niveau classe?

Sur des bases similaires, ce qui est utilisé comme mutex lorsque nous acquérons un verrou de niveau classe

L’object de classe lui-même sera utilisé comme mutex. Le bloc synchronisé équivalent pour votre méthode static synchronized se présentera comme suit:

 public static int getCountTwo() { synchronized(ClassName.class) { return count++; } } 

ClassName est le nom de la classe contenant cette méthode.

Voir la section JLS §8.4.3.6 :

Une méthode synchronisée acquiert un moniteur (§17.1) avant son exécution.

Pour une méthode de classe (statique), le moniteur associé à l’object Class pour la classe de la méthode est utilisé.

Pour une méthode d’instance, le moniteur associé à celui-ci (l’object pour lequel la méthode a été appelée) est utilisé.

L’accent est à moi.

Verrouillage du niveau d’object:

Le locking au niveau de l’object est un mécanisme lorsque vous souhaitez synchroniser une méthode non statique ou un bloc de code non statique, de sorte qu’un seul thread puisse exécuter le bloc de code sur une instance donnée de la classe. Cela devrait toujours être fait pour sécuriser le thread de données au niveau instance. Cela peut être fait comme ci-dessous:

 public class DemoClass { public synchronized void demoMethod(){} } or public class DemoClass { public void demoMethod(){ synchronized (this) { //other thread safe code } } } or public class DemoClass { private final Object lock = new Object(); public void demoMethod(){ synchronized (lock) { //other thread safe code } } 

Verrouillage de niveau de classe:

Le locking au niveau classe empêche plusieurs threads d’entrer dans un bloc synchronisé dans toutes les instances disponibles au moment de l’exécution. Cela signifie que s’il y a 100 instances de DemoClass au moment de l’exécution, un seul thread pourra exécuter demoMethod () dans toutes les instances à la fois, et toutes les autres instances seront verrouillées pour les autres threads. Cela devrait toujours être fait pour sécuriser les threads de données statiques.

 public class DemoClass { public synchronized static void demoMethod(){} } or public class DemoClass { public void demoMethod(){ synchronized (DemoClass.class) { //other thread safe code } } } or public class DemoClass { private final static Object lock = new Object(); public void demoMethod(){ synchronized (lock) { //other thread safe code } } }