synchronized
метод эквивалентен synchronized(this)
блоку.
Только 1 поток может войти в синхронизированный блок.Войдя в него, нить aquires lock.Когда вы wait
внутри блока синхронизации, вы снимаете блокировку (монитор объекта) и паркуете текущий поток.В этот момент другой поток может войти в этот блок.Выполнение будет продолжено, когда другой поток вызовет notify
или notifyAll
для того же объекта, который был вызван wait
.Уведомленный поток «выйдет из состояния ожидания», когда будет снята блокировка данного блока синхронизации.
Подводя итог: ожидание не работает так, как вы ожидаете, оно не блокирует выполнение, а только переводит ожидающий поток в спящий режим, позволяя другимThreads для синхронизации синхронизации aquire.
Таким образом, вы не можете делать то, что хотите, потому что wait
работает не так, как вы ожидаете.То, что вы хотите использовать здесь, это ReentrantLock
.https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantLock.html