转自:https://blog.csdn.net/qq_23359777/article/details/70146778
1.介绍

ArrayBlockingQueue是一个阻塞式的队列,继承自AbstractBlockingQueue,间接的实现了Queue接口和Collection接口。底层以数组的形式保存数据(实际上可看作一个循环数组)。常用的操作包括 add ,offer,put,remove,poll,take,peek。

前三者add offer put 是插入的操作。后面四个方法是取出的操作。他们之间的区别和关联:

add: 内部实际上获取的offer方法,当Queue已经满了时,抛出一个异常。不会阻塞。

offer:当Queue已经满了时,返回false。不会阻塞。

put:当Queue已经满了时,会进入等待,只要不被中断,就会插入数据到队列中。会阻塞,可以响应中断。

取出方法中 remove和add相互对应。也就是说,调用remove方法时,假如对列为空,则抛出一场。另外的,poll与offer相互对应。take和put相互对应。peek方法比较特殊,前三个取出的方法,都会将元素从Queue的头部溢出,但是peek不会,实际上只是,获取队列头的元素。peek方法也不会阻塞。当队列为空时,直接返回Null。

2.对比LinkedBlockingQueue

LinkedBlockingQueue也是一个阻塞式的队列,与ArrayBlockingQueue的区别是什么呢?

LinkedBlockingQueue保存元素的是一个链表。其内部有一个Node的内部类,其中有一个成员变量 Node next。就这样形成了一个链表的结构,要获取下一个元素,只要调用next就可以了。而ArrayBlockingQueue则是一个数组。

LinkedBlockingQueue内部读写(插入获取)各有一个锁,而ArrayBlockingQueue则读写共享一个锁。

3.选择LinkedBlockingQueue还是ArrayBlockingQueue

个人感觉大多数场景适合使用LinkedBlockingQueue。在JDK源码当中有说明,LinkedBlockingQueue比ArrayBlockingQueue有更高的吞吐量,但是性能表现更难预测(也就是说相比ArrayBlockingQueue性能表现不稳定,但是也很稳定了)。

为什么会有吞吐量的区别,个人以为可能是ArrayBlockingQueue两个锁的缘故,在大量并发的情况下,插入和读取都很多时,就会造成一点的时间浪费。

还有一点,应为LinkedBlockingQueue创建时,默认会直接创建一个Integer.MAX_VALUE的数组,当插入少,读取多时,就会造成很大的空间浪费。而LinkedBlockingQueue实际上实在等需要的时候才会创建一个Node节点。

最新文章

  1. Spring下ActiveMQ实战
  2. Hello, RealSense!
  3. EntityFramework_MVC4中EF5 新手入门教程之六 ---6.通过 Entity Framework 更新关联数据
  4. html5调用手机摄像头,实现拍照上传功能
  5. java数据结构和算法------快速排序
  6. 【ADO.NET】6、SQLHelper简单封装
  7. .Net设计模式_工厂模式(1)
  8. Download the Hibernate Tools
  9. Golang中的坑二
  10. Axure RP简单作品
  11. vue+iview实现动态路由和权限验证
  12. Maven的继承以及import作用域
  13. C语法简单测试
  14. macOS在virtualenv中使用wxPython报错
  15. ASP.NET MVC - 安全、身份认证、角色授权和ASP.NET Identity
  16. 如何在servlet中获取spring创建的bean
  17. OC MRC之 @property参数(代码分析)
  18. WIKI常用的表格设计模板
  19. 如何调整Linux内核启动中的驱动初始化顺序-驱动加载优先级
  20. md5,md2加密加盐

热门文章

  1. 那些H5用到的技术(3)——屏幕场景滑动
  2. Python文件的I/o
  3. Linux下jdk安装过程
  4. blender
  5. 九度oj 1031 xxx定律 2009年浙江大学计算机及软件工程研究生机试真题
  6. MySQL操作汇总
  7. Xcode日常使用
  8. 使用webpack2.0 搭建react.js项目
  9. springboot定时任务,去掉指定日期
  10. 深入理解JavaScript系列(50):Function模式(下篇)