Я знаю, что у каждого объекта в Java есть блокировка, но что означает «блокировка монитора»? это то же самое, что и блокировка объекта?
Да, это одно и то же. Их также иногда называют «мьютексом» объекта и «примитивной блокировкой» объекта. (Но когда кто-то говорит о Lock
, он говорит о этом Java-интерфейсе ... который представляет собой другой механизм блокировки.)
Почему метод notify должен отказаться от блокировки монитора?
Метод notify
не не снимает блокировку. Ответственность за снятие блокировки лежит на вашем коде (то есть оставить синхронизированный блок или вернуться из синхронизированного метода) после возврата вызова notify
.
Почему это необходимо? Потому что любой другой поток, который в данный момент ожидает этой блокировки (в вызове wait(...)
), должен повторно получить эту блокировку до завершения вызова wait
.
Почему они выглядят так: notify
/ wait
? Чтобы их можно было использовать для реализации условных переменных.
Как и в первом приведенном выше описании, означает ли это, что текущий объект заблокирован синхронизированным ключевым словом, а затем метод wait снимает блокировку?
Это правильно. Когда поток вызывает someObject.wait()
, его блокировка на someObject
освобождается ... и затем повторно запрашивается (тем же потоком) до возврата вызова wait()
. Конечно, тем временем блокировка someObject
может была получена и освобождена несколько раз другими потоками. Дело в том, что когда возвращается wait
, поток, вызвавший wait
, будет иметь блокировку.