原创

【JAVA】阻塞队列如何实现?分析JDK 阻塞队列源码实现

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://xxlcube.blog.csdn.net/article/details/90437848

阻塞队列,顾名思义,在队列操作时有阻塞机制,防止出现数据不一致,这里只分析两个API的操作源代码

offer(E e)

生产者,生产元素

1、加锁,ReentrantLock

加锁保证了不会同时有多个生产者来生产元素,达到阻塞,否则数据错误乱

2、判断当前队列里的元素数count,和队列容量capacity比较

判断是否可以往里面生产元素

3、数据入队

4、计数器++

5、没满,唤醒notFull阻塞线程,可以继续放元素了

6、释放lock,其它线程可以继续调用offer了

7、唤醒notEmpty阻塞线程,消费元素线程

count==0的条件判断做了一个严格校验,防止元素空浪费一次唤醒操作

 

take()

1、加锁,takeLock,消费锁

2、计数器为0,说明队列空,notEmpty阻塞所有的消费操作

3、消费元素,计数器--

4、计数器判断还有元素,notEmpty唤醒所有消费操作

5、释放锁,takeLock

6、消费的时候,生产操作一直在进行

判断是否达到容量上限边界,等于容量,还可以继续生产,唤醒生产线程

 

阻塞队列实现步骤:

1、生产消费同步加锁,进行阻塞

2、生产和消费完判断队列元素个数,唤醒对应的生产消费线程

 

 

文章最后发布于: 2019-05-22 11:31:04
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 酷酷鲨 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览