并发编程-并发队列

上一篇 <<<线程池
下一篇 >>>Callable与Future模式


并发队列类型

一个是以ConcurrentLinkedQueue为代表的高性能非阻塞队列
一个是以BlockingQueue接口为代表的阻塞队列
都继承自Queue。

阻塞和非阻塞队列的区别

都继承自Queue。
阻塞队列:
a、队列为空的时候,获取元素会阻塞---直到有新的元素加入
b、队列为满的时候,添加元素会阻塞---直到有元素被获取走或情况
非阻塞队列:
a、队列为空的时候,获取元素会返回null
b、队列是无界的【其实底层是有最大数的】,所以不存在为满的情况

常用队列

1.ArrayDeque, (数组双端队列)
2.PriorityQueue, (优先级队列)
3.ConcurrentLinkedQueue, (基于链表的并发队列)
4.DelayQueue, (延期阻塞队列)(阻塞队列实现了BlockingQueue接口)
5.ArrayBlockingQueue, (基于数组的并发阻塞队列)
6.LinkedBlockingQueue, (基于链表的FIFO阻塞队列)
7.LinkedBlockingDeque, (基于链表的FIFO双端阻塞队列)
8.PriorityBlockingQueue, (带优先级的无界阻塞队列)
9.SynchronousQueue (并发同步阻塞队列)

ConcurrentLinkedQueue介绍

a、性能好于BlockingQueue
b、基于链接节点的方式,是无界的
c、使用无锁机制,一直添加尾结点,是线程安全的
d、重要方法:
add 和offer() 都是加入元素的方法(在ConcurrentLinkedQueue中这俩个方法没有任何区别)
poll() 和peek() 都是取头元素节点,区别在于前者会删除元素,后者不会。

BlockingQueue介绍

a、位于并发包(java.util.concurrent)下的,是属于线程安全的
b、2种队列方式:
先进先出(FIFO):先插入的队列的元素也最先出队列,类似于排队的功能。从某种程度上来说这种队列也体现了一种公平性。
后进先出(LIFO):后插入队列的元素最先出队列,这种队列优先处理最近发生的事件。
c、常用子类
ArrayBlockingQueue 有界、先进先出FIFO、内部实现是数组有序

线程池中的队列使用情况

newFixedThreadPool、newSingleThreadExecutor[LinkedBlockingQueue]有界无界是配置的、先进先出FIFO、内部实现是链表
PriorityBlockingQueue 具有优先级的无界阻塞队列 允许插入null对象(对象都要实现java.lang.Comparable排序接口),可以使用迭代器Iterator(无法保证迭代顺序)
newCachedThreadPool[SynchronousQueue]队列内部仅允许容纳一个元素。当一个线程插入一个元素后会被阻塞,除非这个元素被另一个线程消费。
newScheduledThreadPool[DelayedWorkQueue]


相关文章链接:
<<<多线程基础
<<<线程安全与解决方案
<<<锁的深入化
<<<锁的优化
<< << << << << << << << << << << <<<线程池
<< << << << <<<如何优化多线程总结

你可能感兴趣的:(并发编程-并发队列)