Проблема в том, что вы создаете новый экземпляр no
каждый раз, когда вызываете doSomething()
.
synchronized (instanceMutex) {
// each thread will make its own instance here
final Instance no = new Instance();
Вместо этого вам нужно объявить Instance no
глобально и статически, как MyMutex
.
final
, кстати, означает только то, что ссылка на no
не может быть изменена (то есть вы не могли написать no = new Instance()
в каком-то другом месте вашей программы).
static
- ключевое слово, которое вы ищете - это означает, что каждый поток будет ссылаться только на один экземпляр Instance no
.
Если это не поможет, если у вас более одного потока, ожидающего одновременно, возможно, вы выпускаете свои потоки одновременно. Чтобы предотвратить это, вы захотите вернуться назад и проверить no.getInstances()
после того, как вы подождали, например:
synchronized (instanceMutex) {
final Instance no = new Instance();
while (no.getInstances() > 0) { // this check will need to be synchronized as well
instanceMutex.wait();
}
// and only increment `no` once you've made a successful check.
no.incrementInstance();
}
Мораль: условия гонки непростые!