Почему ожидание условия в цикле while? - PullRequest
0 голосов
/ 06 сентября 2018

Из официальных Java Документация класса Condition

public void put(E x) throws InterruptedException {
    lock.lock();
    try {
        while (count == items.length)
            notFull.await();

        items[putptr] = x;

        if (++putptr == items.length)
            putptr = 0;

        ++count;
        notEmpty.signal();
    } finally {
        lock.unlock();
    }
}

Какова роль наличия notFull.await() в цикле while? Я не вижу, что это делает. Кто-нибудь может дать простое объяснение?

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Причина цикла while объяснена в документации Условие :

При ожидании условия «ложное пробуждение» разрешено в целом, как уступка базовой платформе семантика. Это оказывает небольшое практическое влияние на большинство приложений программы как условие всегда должны ожидаться в цикле, тестирование ожидаемого состояния предиката. реализация бесплатна, чтобы удалить возможность ложных пробуждений но рекомендуется, чтобы прикладные программисты всегда предполагали, что они могут возникать и поэтому всегда ждут в цикле .

0 голосов
/ 06 сентября 2018

Предположим, есть две ожидающие темы. Оба получают уведомление. Только один из них должен двигаться вперед. Еще придется перепроверить и подождать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...