阻塞队列(Blocking Queue)是一种特殊类型的队列,用于多线程环境中,实现进程通信;
常见的Java阻塞队列包括:
(1)ArrayBlockingQueue(有界队列)
内部是采用数组存储元素的,初始化需要指定容器大小,ArrayBlockingQueue可以用于实现数据缓存、限流、生产者 - 消费者模式等各种应用。在队列的基础上,提供了阻塞添加和获取元素的能力;循环数组,双指针的形式;插入和删除的时间复杂度都是O(1);
原理:
1)采用Lock锁的Condition通知机制来进行阻塞控制的;
2)利用独占锁 ReentrantLock 实现线程安全;
(2)LinkedBlockingQueue(无界队列)
采用基于链表实现的阻塞队列;默认情况下,阻塞队列的大小,数值特别大,所以被称为无界的队列;内部是由单向链表实现的,采用锁分离技术实现入队出队互不阻塞。添加元素和获取元素都有独立的锁;
QS:线程池中为什么使用LinkedBlockingQueue而不用ArrayBlockingQueue?
因为LinkedBlockingQueue的入队和出队是两把锁,存取元素互不干扰。ArrayBlockingQueue则是使用的同一把锁,存取元素时相互排斥。LinkedBlockingQueue这种锁分离的方式可以有效地减少锁竞争,从而提高线程池的并发性能。
(3)PriorityBlockingQueue(FIFO队列)
阻塞队列的特点:
(1)当队列为空时,从队列中获取元素的操作会被阻塞;直到队列中,有新的元素可用;
(2)当队列已满时,向队列中添加元素的操作会被阻塞,直到队列中有空位置可以用,
常见应用场景:
(1)生产者消费者模型;
(2)线程池的任务队列;
(3)同步队列;多个线程同步一个元素;
标签:----,Java,队列,元素,LinkedBlockingQueue,阻塞,Queue,线程,ArrayBlockingQueue From: https://www.cnblogs.com/kuangmeng/p/18158279