Pytanie Zsynchronizowany blok Java dla .class


Co oznacza ten kod Java? Czy zyska blokadę na wszystkich obiektach MyClass?

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

A powyższy kod różni się od tego:

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

76
2018-01-13 11:33


pochodzenie


Związane z: stackoverflow.com/questions/437620/... - finnw


Odpowiedzi:


The snippet synchronized(X.class) używa instancji klasy jako monitora. Ponieważ istnieje tylko jedna instancja klasy (obiekt reprezentujący metadane klasy w czasie wykonywania) jeden wątek może znajdować się w tym bloku.

Z synchronized(this) blok jest strzeżony przez instancję. Dla każdej instancji tylko jeden wątek może wejść do bloku.

synchronized(X.class) służy do upewnienia się, że w bloku znajduje się dokładnie jeden wątek. synchronized(this) zapewnia, że ​​istnieje dokładnie jeden wątek na wystąpienie. Jeśli spowoduje to, że rzeczywisty kod w wątku blokującym będzie zależał od implementacji. Jeśli zmutować tylko stan instancji synchronized(this) wystarczy.


118
2018-01-13 11:35



"tyle wątków może wejść do bloku, ponieważ istnieje instancja" oznacza, że ​​druga forma działa jako semafor, który nie jest prawdziwy. Powinieneś powiedzieć coś w stylu: "zsynchronizowane (to) zapewnia, że ​​tylko jeden wątek może wejść do bloku dla danej instancji klasy". - liwp
Poprawione. Zamierzałem to powiedzieć. - Thomas Jung
jaka jest instancja klasy a instancja? - Weishi Zeng


Aby dodać do innych odpowiedzi:

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

jest równa

static synchronized void myMethod() {
  //code
}

i

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

jest równa

synchronized void myMethod() {
  //code
}

69
2018-01-13 12:45



Drugie czytanie zajęło mi złapanie, że pierwsze dwa przykłady mają słowo kluczowe "statyczny". Po prostu wskazując to innym, którzy mogli to zobaczyć i przegapili. Bez słowa kluczowego statycznego pierwsze dwa przykłady nie byłyby takie same. - kurtzbot
Te przykłady NIE są równoważne! Zsynchronizowane metody są "zsynchronizowane" jako dziura, gdy wątek próbuje wywołać metody. Z drugiej strony bloki mogą mieć kod nad i pod nimi, który może zostać wykonany z wielu wątków. Synchronizują się tylko w bloku! To nie to samo! - JacksOnF1re
public static Singleton getInstance () {if (instancja == null) {synchronized (Singleton.class) {instance = new Singleton (); }} return instance; } - JacksOnF1re
Chodzi o to, że istnieje jest brak kodu poza synchronized Bloki. To sprawia, że ​​są one równoważne. Jeśli zmienisz jeden przykład, nie będą one już takie same. - Jorn


Nie, pierwszy dostanie blokadę definicji klasy MyClassnie wszystkie jego wystąpienia. Jeśli jednak zostanie użyty w instancji, będzie to skutecznie blokować wszystkie inne wystąpienia, ponieważ mają one wspólną definicję klasy.

Drugi otrzyma blokadę tylko na bieżącej instancji.

Jeśli chodzi o to, czy to sprawia, że ​​twoje wątki są bezpieczne, to jest o wiele bardziej złożone pytanie - musielibyśmy zobaczyć twój kod!


21
2018-01-13 11:35



tak, MyClass.class może być dowolną zmienną statyczną i mieć taki sam efekt. - pstanton