Существует очень простая причина, по которой вам нужно synchronized
, чтобы позвонить wait
synchronized
гарантирует, что никто не звонит notify
или notifyAll
в то время, когда вы звоните wait
Например: Тема 1
synchronized( obj )
{
triggerActionOnThread2();
obj.wait();
}
Поток 2 (запускается triggerActionOnThread2)
...
synchronized( obj )
{
obj.notify();
}
Если у вас нет синхронизированных блоков, то notify
может произойти до (или во время) wait
, а затем wait
пропустит notify
, и вы можете повесить поток 1.
Представьте вышеперечисленные блоки кода без блоков synchronized
и представьте, что поток 2 выполняется через весь путь уведомления до вызова wait.
Кстати, я задаю этот вопрос на собеседованиях с инженерами Java, когда работа будет включать многопоточное программирование.