Нет, только один добавит узел. Обратите внимание, что ваш wait
-вызов в enqueue
находится внутри al oop:
while(this.queue.size() == this.limit) {
wait();
}
Уведомляются все три потока, но только один поток может быть в synchronized
-блоке. Первый поток, входящий в блок, добавляет узел, поэтому очередь снова заполняется. Оба других потока входят в блок (один за другим), но видят, что очередь снова заполняется, что снова переводит их прямо в состояние ожидания, поскольку это l oop -условие.
Вы можете представить wait
быть точкой выхода и входа блока synchronized
. Когда поток входит в wait
, соответствующая блокировка снимается. Поток, который ожидал в wait
и получил уведомление, снова пытается получить соответствующую блокировку для критического раздела и блокирует его, если он в настоящее время используется. Таким образом, одновременно может участвовать только один из трех уведомленных потоков.