并发队列 – 有界阻塞队列 ArrayBlockingQueue 原理探究
2018-03-08 10:55
525 查看
并发队列 – 有界阻塞队列 ArrayBlockingQueue 原理探究
http://www.importnew.com/25566.html一、 前言
上节介绍了无界链表方式的阻塞队列LinkedBlockingQueue,本节来研究下有界使用数组方式实现的阻塞队列ArrayBlockingQueue二、 ArrayBlockingQueue类图结构
如图ArrayBlockingQueue内部有个数组items用来存放队列元素,putindex下标标示入队元素下标,takeIndex是出队下标,count统计队列元素个数,从定义可知道并没有使用volatile修饰,这是因为访问这些变量使用都是在锁块内,并不存在可见性问题。另外有个独占锁lock用来对出入队操作加锁,这导致同时只有一个线程可以访问入队出队,另外notEmpty,notFull条件变量用来进行出入队的同步。另外构造函数必须传入队列大小参数,所以为有界队列,默认是Lock为非公平锁。
三、offer操作
在队尾插入元素,如果队列满则返回false,否者入队返回true。四、put操作
在队列尾部添加元素,如果队列满则等待队列有空位置插入后返回五、poll操作
从队头获取并移除元素,队列为空,则返回null。六、take操作
从队头获取元素,如果队列为空则阻塞直到队列有元素。七、peek操作
返回队列头元素但不移除该元素,队列为空,返回null八、 size操作
获取队列元素个数,非常精确因为计算size时候加了独占锁,其他线程不能入队或者出队或者删除元素九、总结
ArrayBlockingQueue通过使用全局独占锁实现同时只能有一个线程进行入队或者出队操作,这个锁的粒度比较大,有点类似在方法上添加synchronized的意味。其中offer,poll操作通过简单的加锁进行入队出队操作,而put,take则使用了条件变量实现如果队列满则等待,如果队列空则等待,然后分别在出队和入队操作中发送信号激活等待线程实现同步。另外相比LinkedBlockingQueue,ArrayBlockingQueue的size操作的结果是精确的,因为计算前加了全局锁。相关文章推荐
- 并发队列 – 有界阻塞队列 ArrayBlockingQueue 原理探究
- 并发队列-有界阻塞队列ArrayBlockingQueue原理探究
- 并发队列-无界阻塞优先级队列PriorityBlockingQueue原理探究
- 并发队列-无界阻塞优先级队列PriorityBlockingQueue原理探究
- 并发队列-无界阻塞队列LinkedBlockingQueue原理探究
- 并发队列-无界阻塞队列LinkedBlockingQueue原理探究
- 并发队列-无界阻塞优先级队列PriorityBlockingQueue原理探究
- 并发队列ConcurrentLinkedQueue和阻塞栈LinkedBlockingQueue用法和阻塞队列ArrayBlockingQueue
- Java 并发 --- 阻塞队列之ArrayBlockingQueue源码分析
- Java并发之BlockingQueue 阻塞队列(ArrayBlockingQueue、LinkedBlockingQueue、DelayQueue、PriorityBlockingQueue、SynchronousQueue)
- 非阻塞队列ConcurrentLinkedQueue与阻塞队列LinkedBlockingQueue原理探究
- Java多线程与并发应用-(10)-java阻塞队列实现ArrayBlockingQueue
- 并发队列-无界非阻塞队列 ConcurrentLinkedQueue 原理探究
- 并发队列-无界非阻塞队列 ConcurrentLinkedQueue 原理探究
- 并发队列-无界非阻塞队列ConcurrentLinkedQueue原理探究
- Java阻塞队列ArrayBlockingQueue使用及原理分析
- JAVA并发之阻塞队列LinkedBlockingQueue与ArrayBlockingQueue
- Java阻塞队列ArrayBlockingQueue和LinkedBlockingQueue实现原理分析
- Java阻塞队列ArrayBlockingQueue和LinkedBlockingQueue实现原理分析
- 深入剖析java并发之阻塞队列LinkedBlockingQueue与ArrayBlockingQueue