观察下面的代码。
class BoundedBuffer {
final Lock lock = new ReentrantLock();
final Condition notFull = lock.newCondition();
final Condition notEmpty = lock.newCondition();
final Object[] items = new Object[100];
int putptr, takeptr, count;
public void put(Object 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();
}
}
public Object take() throws InterruptedException {
lock.lock();
try {
while (count == 0)
notEmpty.await();
Object x = items[takeptr];
if (++takeptr == items.length) takeptr = 0;
--count;
notFull.signal();
return x;
} finally {
lock.unlock();
}
}
}
这段代码是并发大神 Doug Lea 在 Conditiion 接口上给出的例子,这段代买实现了一个生产者消费者模型,分别实现了 put 和 take 两个方法,但是不知道大家有没有注意到,在 count 字段的值的时候,两个方法用的都是 while,而没有用if,这是为什么呢?难道用 if 不可以吗?这就涉及到一个名词叫虚假唤醒,本文将对这个概念进行介绍。
预订后,您将在 01月25日 之前获得一篇专享文章。
请务必 关注 GitChat 服务号 以查看活动进度及获取活动通知。
届时文章未达标,款项将退回到微信账户。
绑定成功
预订达标,作者开始写作
审核未达标,本场 Chat 终止
审核达标,文章发布
审核未达标,本场 Chat 终止