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