Java Synchronized Block for.класс


что означает этот код 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 ??
}
3 83

3 ответа:

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

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

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

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

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

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

static synchronized void myMethod() {
  //code
}

и

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

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

synchronized void myMethod() {
  //code
}

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

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

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