Java синхронизировал блок для .class

Что этот Java кодирует средний? Будет это получать соединить все объекты MyClass?

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

И как вышеупомянутый код отличается от этого:

synchronized(this) {
   //is all objects of MyClass are thread-safe now ??
}
97
задан Andrew Tobilko 15 February 2018 в 10:55
поделиться

3 ответа

Нет, первое получит замок на определении класса MyClass , не все экземпляры этого. Однако, если используется в экземпляре, это будет эффективно блокировать все остальные экземпляры, поскольку они делятся одним определением класса.

Вторым получит замок только на текущем экземпляре.

Что касается того, делает ли это ваши объекты потоком безопасным, это гораздо более сложный вопрос - нам нужно будет увидеть ваш код!

-121--756175-

Синхронизация синхронизирована (XClass) использует экземпляр класса в виде монитора. Поскольку имеется только один экземпляр класса (объект, представляющий метаданные классов во время выполнения), один поток может быть в этом блоке.

С синхронизирован (это) блок охраняется экземпляром. Для каждого экземпляра только один поток может ввести в блок.

Синхронизирован (X.class) используется, чтобы убедиться, что в блоке имеется ровно один нить. синхронизировано (это) обеспечивает ровно один нить в случае. Если это сделает фактический код в блоке, безопасно, зависит от реализации. Если мутате только состояния экземпляра синхронизированы (это) достаточно.

138
ответ дан 24 November 2019 в 05:23
поделиться

Чтобы добавить к другим ответам:

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

эквивалентно

static synchronized void myMethod() {
  //code
}

и

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

эквивалентно

synchronized void myMethod() {
  //code
}
79
ответ дан 24 November 2019 в 05:23
поделиться

Нет, первое получит замок на определении класса MyClass , не все экземпляры этого. Однако, если используется в экземпляре, это будет эффективно блокировать все остальные экземпляры, поскольку они делятся одним определением класса.

Вторым получит блокировку только на текущем экземпляре.

Что касается того, заставляет ваши объекты безопасными потоками, это гораздо более сложный вопрос - нам нужно будет видеть ваш код!

21
ответ дан 24 November 2019 в 05:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: