为什么要在while循环中等待Condition?

时间:2018-09-06 06:03:37

标签: java multithreading concurrency

来自官方Java Documentation of the class 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 :(得分:2)

Condition文档中说明了while循环的原因:

  

在等待条件时,允许“虚假唤醒”以   通常作为基础平台的让步而发生   语义。这对大多数应用程序几乎没有实际影响   作为条件的程序应始终在循环中等待,   测试正在等待的状态谓词。一个   实施是免费的,消除了虚假唤醒的可能性   ,但建议应用程序程序员始终假定   它们可能会发生,因此总是循环等待。

答案 1 :(得分:1)

假设有两个等待线程。两者都得到通知。他们中只有一个应该前进。另一个必须重新检查并等待。