Java

Зачем создают отдельный объект монитора для synchronized блока?

Я часто вижу, что в качестве монитора для synchronized используют отдельный объект:
class SomeClass {

private static final Object monitor = new Object();

void doSomething() {
synchronized (monitor) {
// . .
}
}
}
Ринат Саитов
Ринат Саитов
1 675
Делается это для эффективности/быстродействия, порой использование synchronized(this) не лучшая идея. плюс классы потомки-субклассы использовать могут его. учимся у лучших. Mark Reinhold Java Chief Architest Java Platform Group - Oracle. Класс Reader

/**
* The object used to synchronize operations on this stream. For
* efficiency, a character-stream object may use an object other than
* itself to protect critical sections. A subclass should therefore use
* the object in this field rather than {@code this} or a synchronized
* method.
*/
protected Object lock;
Юрий Я
Юрий Я
503
Лучший ответ
Ринат Саитов Я так понимаю что это делается для "особых методов", чтобы если у монитора this был статус «занят», тот не стал ждать. Правильно?
спросите у тех кто создаёт.
Илья Купцов
Илья Купцов
96 636
У тебя может быть много других разных общих ресурсов и если все будут проходить через один объект класса, то это серьезно скажется на производительности. А вообще, да, ты прав, это никто не использует. Используют ReentrantLock
Эльдар Ахмедиев И ваще принято называть объекты по их названию, то есть private static final Object lock = new Object();
Попробую угадать...
Первый вариант: Синхронизировать по this не хотели потому как нужно чтобы монитор был один на все экземпляры класса SomeClass и его потомков. В принципе, с тем же успехом можно было повестить синхронайз на SomeClass.class.
Второй вариант: Синхронизировать по SomeClass.class не хотели потому как он уже используется в качестве монитора ещё где-то. Т. е. нужен второй монитор, чтобы не висеть зря на одном
Третий вариант: судя по имени поля (monitor) писавший уже имел дело с многопоточным программированием но с java еще пока не очень хорошо знаком.
Четвертый вариант: это просто говнокод.
Ринат Саитов Вообще одно и тоже пишут по разному, например:
void doSomething() {
  final Object monitor = new Object();
  synchronized (monitor) {
    // . .
  }
}