脚本宝典收集整理的这篇文章主要介绍了

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群277859234一起讨论学习。如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典网站推荐给程序员好友。 本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。

80%的人都看过