阻塞队列整理

ArrayBlockingQueue
基于同一个ReentrantLock锁实现线程安全,同时记录takeIndex与putIndex两个索引用于拿取和增加队列索引
使用集合实现的有界队列,一旦创建ArrayBlockingQueue对象,容量就固定了,对于排队等待的生产者或者消费者线程ArrayBlockingQueue支持公平的策略
通过使用ReentrantLock实现公平锁和非公平锁
FIFO先进先出
head节点是队列中保留时间最长的
tail节点时队列中保留时间最短的
新增节点从tail节点开始增加
添加节点到一个满的队列中,则会导致阻塞操作
获得几点从一个空的队列中,则会导致阻塞操作
 
线程:安全,基于同一个ReentrantLock下两个Condition,一个notEmpty(Condition for waiting takes),一个notFull(Condition for waiting puts ),
实现方式:Object数组,
初始大小:自定义大小
扩容:不能扩容,创建对象时初始化大小后不能修改容量
 
 
LinkedBlockingQueue
基于两个锁实现线程安全访问,takeLock锁(ReentrantLock)与putLock锁(ReentrantLock)
count队列数量变量时AtomicInteger原子int类型,
LinkedBlockingQueue比基于集合实现的ArrayBlockingQueue有更高的吞吐量,但是在大多数并发应用中比ArrayBlockingQueue难以预算的性能
可以通过在构造函数中限定容量来防止容量过度膨胀
基于单向链表的阻塞队列,
FIFO先进先出
head节点是队列中保留时间最长的
tail节点时队列中保留时间最短的
新增节点从tail节点开始增加
线程:安全,基于两个ReentrantLock实现,一个takeLock锁(ReentrantLock),基于takeLock锁的notEmpty(Condition for waiting takes)一个putLock锁(ReentrantLock),基于takeLock锁的notFull(Condition for waiting puts )
实现方式:Object数组,同时又takeIndex与putIndex两个索引用于拿取和增加队列索引
初始大小:自定义大小,最大容量为Integer.Maxvalue
扩容:由于是使用链表实现的,因此可以动态增加

猜你喜欢

转载自www.cnblogs.com/use-D/p/9717672.html