Java多线程框架源码阅读之---AQS的ConditionObject

发布时间:2019-11-18 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了Java多线程框架源码阅读之---AQS的ConditionObject脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

前置文章https://segmentfault.com/a/11...,如果不了解AQS的基本lock和unlock实现机制,建议先看一下这个文章。

CondITion类似于wait和notify,notifyAll,常用于实现生产者消费者。以下代码是一个用ReentrantLock的condition做的一个生产者消费者例子。

import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;  class BoundedBuffer {     final Lock lock = new ReentrantLock();     // condition 依赖于 lock 来产生     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();  // 队列已满,等待,直到 not full 才能继续生产             items[putptr] = x;             if (++putptr == items.length) putptr = 0;             ++count;             notEmpty.signal(); // 生产成功,队列已经 not empty 了,发个通知出去         } finally {             lock.unlock();         }     }      // 消费     public Object take() throws InterruptedException {         lock.lock();         try {             while (count == 0)                 notEmpty.await(); // 队列为空,等待,直到队列 not empty,才能继续消费             Object x = items[takeptr];             if (++takeptr == items.length) takeptr = 0;             --count;             notFull.signal(); // 被我消费掉一个,队列 not full 了,发个通知出去             return x;         } finally {             lock.unlock();         }     } }

脚本宝典总结

以上是脚本宝典为你收集整理的Java多线程框架源码阅读之---AQS的ConditionObject全部内容,希望文章能够帮你解决Java多线程框架源码阅读之---AQS的ConditionObject所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。