Я часто вижу, что в качестве монитора для synchronized используют отдельный объект:
class SomeClass {
private static final Object monitor = new Object();
void doSomething() {
synchronized (monitor) {
// . .
}
}
}
Java
Зачем создают отдельный объект монитора для synchronized блока?
Делается это для эффективности/быстродействия, порой использование 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;
/**
* 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;
Ринат Саитов
Я так понимаю что это делается для "особых методов", чтобы если у монитора this был статус «занят», тот не стал ждать. Правильно?
спросите у тех кто создаёт.
У тебя может быть много других разных общих ресурсов и если все будут проходить через один объект класса, то это серьезно скажется на производительности. А вообще, да, ты прав, это никто не использует. Используют ReentrantLock
Эльдар Ахмедиев
И ваще принято называть объекты по их названию, то есть private static final Object lock = new Object();
Попробую угадать...
Первый вариант: Синхронизировать по this не хотели потому как нужно чтобы монитор был один на все экземпляры класса SomeClass и его потомков. В принципе, с тем же успехом можно было повестить синхронайз на SomeClass.class.
Второй вариант: Синхронизировать по SomeClass.class не хотели потому как он уже используется в качестве монитора ещё где-то. Т. е. нужен второй монитор, чтобы не висеть зря на одном
Третий вариант: судя по имени поля (monitor) писавший уже имел дело с многопоточным программированием но с java еще пока не очень хорошо знаком.
Четвертый вариант: это просто говнокод.
Первый вариант: Синхронизировать по this не хотели потому как нужно чтобы монитор был один на все экземпляры класса SomeClass и его потомков. В принципе, с тем же успехом можно было повестить синхронайз на SomeClass.class.
Второй вариант: Синхронизировать по SomeClass.class не хотели потому как он уже используется в качестве монитора ещё где-то. Т. е. нужен второй монитор, чтобы не висеть зря на одном
Третий вариант: судя по имени поля (monitor) писавший уже имел дело с многопоточным программированием но с java еще пока не очень хорошо знаком.
Четвертый вариант: это просто говнокод.
Ринат Саитов
Вообще одно и тоже пишут по разному, например:
void doSomething() {
final Object monitor = new Object();
synchronized (monitor) {
// . .
}
}
void doSomething() {
final Object monitor = new Object();
synchronized (monitor) {
// . .
}
}
Похожие вопросы
- Нас обманывали! Что на самом деле означает synchronized void doSomething()
- Synchronized, проблема с мютексами
- Возможно глупый вопрос, но всё же... Зачем создавать объекты в java?
- Что такое объекты в Java?
- Какая разница между объектом, экземпляром, ссылке? Прочитайте вопрос полностью...
- Как обратиться к объектам другого класса
- Не могу понять ОБЪЕКТЫ в языках программ. Объясните простыми словами
- Что такое класс, метод и объект в языке программирования java?
- Что создает List[] ?
- Зачем создают приватные переменные, а затем делают их общедоступными через публичные методы?