Вы отметили правильно, что notifyAll
должен быть назван от синхронизируемого блока.
Однако в Вашем случае, из-за автоупаковки, объект, на котором Вы синхронизировались, не является тем же экземпляром, на который Вы вызвали notifyAll
. На самом деле, новое, увеличенное foo
, экземпляр все еще ограничен стеком, и никакие другие потоки не могли возможно быть заблокированы на wait
вызов.
Вы могли реализовать свой собственный, изменяемый счетчик, на котором выполняется синхронизация. В зависимости от Вашего приложения Вы могли бы также найти, что AtomicInteger удовлетворяет Ваши потребности.