Например, в этом классическом фрагменте кода потребителя-производителя:
synchronized (this) {
while (queue.isEmpty()) {
this.wait();
}
queue.remove();
this.notifyAll();
}
Поток потребителя .wait()
, о котором уведомляет производитель, активируется, а затем конкурирует за ресурс с другими потоками потребителя, ожидающими synchronized (this)
. Это вызывает состояние гонки. Но почему бы просто не позволить потребителю .wait()
удерживать ресурс, пока он не существует, блок synchronized
?