Вопрос

Что означает этот 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 ??
}
Это было полезно?

Решение

Фрагмент 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, не все случаи этого.Однако, если он используется в экземпляре, это эффективно заблокирует все остальные экземпляры, поскольку они используют одно определение класса.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top