Java LinkedBlockingQueue和ArrayBlockingQueue分析

本文详细解析了LinkedBlockingQueue与ArrayBlockingQueue的工作原理及应用场景,前者为链表实现的阻塞队列,后者则适用于已知队列大小的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LinkedBlockingQueue是一个链表实现的堵塞队列,在链表一头增加元素,假设队列满。就会堵塞。还有一头取出元素。假设队列为空。就会堵塞。


LinkedBlockingQueue内部使用ReentrantLock实现插入锁(putLock)和取出锁(takeLock)。

putLock上的条件变量是notFull。即能够用notFull唤醒堵塞在putLock上的线程。takeLock上的条件变量是notEmtpy。就可以用notEmpty唤醒堵塞在takeLock上的线程。


知道了LinkedBlockingQueue,再来理解ArrayBlockingQueue就比較好理解了。类似LinkList和ArrayList的差别。假设知道队列的大小,那么使用ArrayBlockIngQueue就比較合适了,由于它使用循环数组实现,可是假设不知道队列未来的大小,那么使用ArrayBlockingQueue就必定会导致数组的来回复制。减少效率。


记住多线程保护的一定是数据,而不是代码,在此例中,锁保护的也是当中共享的队列对象,防止出现不一致的情况。

原文:http://blog.youkuaiyun.com/hongchangfirst/article/details/39667677

作者:hongchangfirst

hongchangfirst的主页:http://blog.youkuaiyun.com/hongchangfirst


转载于:https://www.cnblogs.com/bhlsheji/p/5136964.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值