Я модифицирую некоторый параллельный код на работе и недавно прочитал документацию Java по внутренним блокировкам и синхронизации.
Учитывая, что каждый объект имеет внутреннюю блокировку, зачем мне вообще создавать отдельную объект в целях контроля доступа к определенному элементу?
Я понимаю, что может быть вариант использования, когда интересующий элемент не является объектом malloc код>, (
vs Integer) и, следовательно, не имеет встроенной блокировки, но... если предположить, что нас интересует синхронизация некоторого статического объекта, есть ли что терять?например:
Код: Выделить всё
public class main {
public static void main (String[] args){
Integer foo = 10;
synchronized(foo){
foo ++;
}
}
}
Если бы я хотел обновить foo из нескольких потоков синхронно, почему бы мне просто не использовать объект, который я хочу изменить? Это менее эффективно? Я вижу множество синхронизированных(this) и отдельных случаев, когда мы можем создать объект блокировки для целей синхронизации:
Код: Выделить всё
public class main {
public static void main (String[] args){
Integer foo = 10;
Object fooLock = new Object();
synchronized(fooLock){
foo ++;
}
}
}
Зачем мне вообще создавать fooLock, если вместо этого я могу использовать объект, представляющий реальный интерес? Действительно ли это не рекомендуется (не идиоматично) или есть практическая причина не делать этого?
Я подумываю о первом подходе (
) для статического объекта соединения с сокетом, но меня беспокоит то, что я не видел обсуждения этого вопроса. Я что-то упустил?
Подробнее здесь:
https://stackoverflow.com/questions/781 ... ock-object