
文章插图
在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口、ArrayBlockingQueue、DelayQueue 。
LinkedBlockingQueue 队列是BlockingQueue接口的实现类 , 所以它具有BlockingQueue接口的一切功能特点 。LinkedBlockingQueue队列 按照first-in-first-out (FIFO)先进先出的方式对元素进行排序 。LinkeBlockingQueue 提供了两种构造函数 , 一个构造函数构造一个队列容量为固定个数的队列 , 另一个无参构造函数构造一个队列容量为
Integer.MAX_VALUE的队列.public LinkedBlockingQueue() {this(Integer.MAX_VALUE);}public LinkedBlockingQueue(int capacity) {if (capacity <= 0) throw new IllegalArgumentException();this.capacity = capacity;last = head = new Node<E>(null);}ArrayBlockingQueue和LinkedBlockingQueue对比ArrayBlockingQueue和LinkedBlockingQueue都是实现BlockingQueue接口 , 所以在使用方式上是一致的 , 下面我们就不介绍使用方法 , 而是从二者的性能及底层数据结构的实现角度进行- ArrayBlockingQueue插入和删除数据 , 只采用了一个lock锁 , 读取和写入操作无法并行 。所以在高并发场景下执行效率会比LinkedBlockingQueue慢一些 。

文章插图
- LinkedBlockingQueue采用“two lock queue”算法变体 , 双锁(ReentrantLock):takeLock、putLock , 允许读写并行 , remove(e)和迭代器iterators需要获取2个锁 。这样可以降低线程由于线程无法获取到lock而进入WAITING状态的可能性 , 从而提高了线程并发执行的效率 。

文章插图
- ArrayBlockingQueue底层代码是采用数组实现的 , 创建的时候必须指定队列的容量并分配存储空间;LinkedBlockingQueue采用的是链表数据结构实现的 , 其链表节点的存储空间分配是动态的 , 新的元素对象加入队列分配空间 , 元素对象从队列取出之后存储空间GC , 初始化时指定的是队列的最大容量 。但是使用链表数据结构既是LinkedBlockingQueue优势也是它的劣势 , 高并发场景下由于空间动态分配需要java JVM频繁的进行垃圾回收 。
欢迎关注我的博客 , 里面有很多精品合集
- 本文转载注明出处(必须带连接 , 不能只转文字):字母哥博客 。
- 《手摸手教你学Spring Boot2.0》
- 《Spring Security-JWT-OAuth2一本通》
- 《实战前后端分离RBAC权限管理系统》
- 《实战SpringCloud微服务从青铜到王者》
- 《VUE深入浅出系列》
- 春季老年人吃什么养肝?土豆、米饭换着吃
- 三八妇女节节日祝福分享 三八妇女节节日语录
- 老人谨慎!选好你的“第三只脚”
- 校方进行了深刻的反思 青岛一大学生坠亡校方整改校规
- 脸皮厚的人长寿!有这特征的老人最长寿
- 长寿秘诀:记住这10大妙招 100%增寿
- 春季老年人心血管病高发 3条保命要诀
- 眼睛花不花要看四十八 老年人怎样延缓老花眼
- 香槟然能防治老年痴呆症? 一天三杯它人到90不痴呆
- 老人手抖的原因 为什么老人手会抖
