Учитывая, что есть только один замок для каждого экземпляра класса, то почему не Java просто позволяют нам это сделать:Зачем нам нужно указывать блокировку для синхронизированных операторов?
void method() {
synchronized {
// do something
}
// do other things
}
вместо этого:
void method() {
synchronized (lock) {
// do something
}
// do other things
}
Что цель указав замок? Разве это имеет значение, если я выбираю один объект как замок над другим? Или я могу выбрать любой случайный объект?
EDIT:
Оказалось, что мое понимание синхронизированных методов является неправильным на фундаментальном уровне.
Я думал, что разные синхронизированные методы или блоки полностью независимы друг от друга независимо от блокировок. Скорее всего, все синхронизированные методы или блоки с одной и той же блокировкой могут быть доступны только одним потоком, даже если такие синхронизированные методы/блоки из разных классов (документация должна была подчеркнуть это больше: ВСЕ синхронизированы методы/блоки, независимо от местоположения , все, что имеет значение, - это замок).
* Имеет ли значение, если я выбираю один объект в качестве замка над другим? * Да, конечно, это имеет значение. Если целью является использование этого в качестве блокировки, используйте синхронизацию (это). Вот что делают регулярные синхронизированные методы: они синхронизируются с этим. –
Имеет ли значение, запираете ли вы свою входную дверь или входную дверь соседей? Конечно. Если вы заблокируете неправильную дверь, люди все равно могут войти в ваш дом. – Andreas
Это просто любой случайный объект, но важно, чтобы вы могли иметь 2 отдельных взаимных исключения, например, разрешить двум потокам доступ к двум различным методам, но только по одному потоку каждый метод сразу. Таким образом, обе технически синхронизированы. – Mordechai