Domanda

Che cosa significa questo codice Java? Sarà guadagnare blocco su tutti gli oggetti di MyClass?

synchronized(MyClass.class) {
   //is all objects of MyClass are thread-safe now ??
}

E come il codice di cui sopra è diversa da questa:

synchronized(this) {
   //is all objects of MyClass are thread-safe now ??
}
È stato utile?

Soluzione

Il synchronized(X.class) frammento utilizza l'istanza di classe come un monitor. Poiché v'è una sola istanza di classe (l'oggetto che rappresenta i metadati classe in esecuzione) un thread può essere in questo blocco.

Con synchronized(this) il blocco è sorvegliato da l'istanza. Per ogni esempio solo un thread può entrare nel blocco.

synchronized(X.class) è usato per fare in modo che ci sia esattamente un thread nel blocco. synchronized(this) assicura che vi sia esattamente un thread per esempio. Se questo rende il codice effettivo nel blocco thread-safe dipende dall'implementazione. Se mutate unico stato dell'istanza synchronized(this) è sufficiente.

Altri suggerimenti

Per aggiungere alle altre risposte:

static void myMethod() {
  synchronized(MyClass.class) {
    //code
  }
}

è equivalente a

static synchronized void myMethod() {
  //code
}

e

void myMethod() {
  synchronized(this) {
    //code
  }
}

è equivalente a

synchronized void myMethod() {
  //code
}

No, il primo otterrà un blocco sulla definizione della classe di MyClass, non tutte le istanze di esso. Tuttavia, se usato in un caso, questo sarà effettivamente bloccare tutti gli altri casi, in quanto essi condividono una singola definizione di classe.

Il secondo sarà ottenere un blocco sull'istanza corrente.

Quanto alla questione se questo rende gli oggetti thread-safe, questa è una domanda molto più complesso -! Avremmo bisogno di vedere il vostro codice

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top