Проблема, которую решает synchronized
, заключается в том, что он позволяет двум потокам иметь согласованное представление об общей переменной suspendFlag
.
В некоторых реальных программах поток может установить другие общие переменные перед установкой susependFlag=false
. Если synchronized
не использовался, то ожидающий поток мог бы проснуться и увидеть suspendFlag==false
, но не увидеть другие установленные переменные. Или, что еще хуже, он может видеть, что некоторые из них установлены, но не другие.
Без синхронизации Java не гарантирует, что разные потоки увидят переменные, обновляемые в одном порядке.
Я получаю ту же ошибку: java .lang.IllegalMonitorStateException: текущий поток не является владельцем.
Библиотека Java пытается помочь вам, заставляя вас использовать synchronized
до того, как это позволит вам использовать wait()
и notify()
. Правило простое: вы можете вызывать o.wait()
, o.notify()
или o.notifyAll()
только из кода, который находится внутри блока synchronized(o)
. Если вы нарушите это правило, библиотека выдаст исключение.
Когда ваш код вызывает o.wait()
вызов wait () временно разблокирует блокировку монитора, чтобы другой поток мог для синхронизации на o
и звоните o.notify()
. Вызов o.wait()
гарантированно повторно заблокирует o
перед возвратом.