保存成功
订阅成功
保存失败,请重试
提交成功
预订中

Java 中的虚假唤醒

¥2.99会员免费看
Hn

观察下面的代码。

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 不可以吗?这就涉及到一个名词叫虚假唤醒,本文将对这个概念进行介绍。

预订截止倒计时 0
详情
56 人已预订
60 预订成功
会员免费预订
¥2.99 原价预订
订阅须知

预订后,您将在 01月25日 之前获得一篇专享文章。

请务必 关注 GitChat 服务号 以查看活动进度及获取活动通知。

届时文章未达标,款项将退回到微信账户。

关注提示×
扫码关注公众号,获得 Chat 最新进展通知!
入群与作者交流×
扫码后回复关键字 入群
Chat·作者交流群
入群码
该二维码永久有效
严选标准
知道了
Chat 状态详情
开始预订
预订结果公布01月18日

预订达标,作者开始写作

审核未达标,本场 Chat 终止

作者文章审核结果公布01月25日

审核达标,文章发布

审核未达标,本场 Chat 终止

Chat 完结
×
已购列表