Ваша синхронизация в порядке, и не приведет к каким-либо неупорядоченным проблемам выполнения.
Однако я замечаю некоторые проблемы.
Во-первых, ваш waitUntilEmpty
метод будет гораздо более своевременным , если вы добавите list.notifyAll()
после list.remove(0)
в removeAndDouble
. Это устранит до 10 секунд задержки в вашем wait(10000)
.
Во-вторых, ваш list.notify
в add(Integer)
должен быть notifyAll
, потому что notify
пробуждает только один поток, и он может пробудить поток, ожидающий внутри waitUntilEmpty
вместо waitUntilNotEmpty
.
В-третьих, ничто из вышеперечисленного не является предельным для жизнеспособности вашего приложения, поскольку вы использовали ограниченные ожидания, но если вы сделаете два вышеуказанных изменения, ваше приложение будет иметь лучшую многопоточную производительность (waitUntilEmpty
), и ограниченные ожидания станут ненужными может стать простым старым безошибочным ожиданием.