Синхронизированный блок 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 ??
}

Ответ 1

В фрагменте synchronized(X.class) используется экземпляр класса в качестве монитора. Поскольку в этом блоке может быть только один экземпляр класса (объект, представляющий метаданные класса во время выполнения), один поток может быть в этом блоке.

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

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

Ответ 2

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

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

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

static synchronized void myMethod() {
  //code
}

и

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

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

synchronized void myMethod() {
  //code
}

Ответ 3

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

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

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