非堵塞队列:
1、ArrayDeque,(数组双端队列)
ArrayDeque(非堵塞队列)是 JDK 容器中的一个双端队列实现,内部使用数组进行元素存储,不允许存储 null 值,可以高效的进行元素查找和尾部插入取出,是用作队列、双端队列、栈的绝佳选择,性能比Linkedlist 还要好。
2、PriorityQueue,(优先级队列)
PriorityQueue (非堵塞队列)一个基于优先级的无界优先级队列。优先级队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的Comparator 进行排序,具体取决于所使用的构造方法。该队列不允许使用null 元素也不允许插入不可比较的对象
3、ConcurrentLinkedQueue(基于链表的并发队列)
ConcurrentLinkedQueue(非堵塞队列):是一个适用于高并发场景下的队列,通过无锁的方式,实现了高并发状态下的高性能。ConcurrentLinkedQueue的性能要好于 BlockingQueue 接口,它是一个基于链接节点的无界线程安全队列。该队列的元素遵循先进先出的原则。该队列不允许 null 元素。
堵塞队列:
1、DelayQueue,(基于时间优先级的队列,延期阻塞队列)
DelayQueue 是一个没有边界 BlockingQueue 实现,加入其中的元素必须实现Delayed 接口。当生产者线程调用 put 之类的方法加入元素时,会触发 Delayed接口中的 compareTo 方法进行排序,也就是说队列中元素的顺序是按到期时间排序的,而非它们进入队列的顺序。排在队列头部的元素是最早到期的,越往后到期时间趣晚。
2、ArrayBlockingQueue(基于数组的并发阻塞队列)
ArrayBlockingQueue 是一个有边界的阻塞队列,它的内部实现是一个数组。有边界的意思是它的容量是有限的,我们必须在其初始化的时候指定它的容量大小,容量大小一旦指定就不可改变。ArrayBlockingQueue 是以先进先出的方式存储数据
3、LinkedBlockingQueue(基于链表的 FIFO 阻塞队列)
LinkedBlockingQueue 阻塞队列大小的配置是可选的,如果我们初始化时指定一个大小,它就是有边界的,如果不指定,它就是无边界的。说是无边界,其实是采用了默认大小为 Integer.MAX_VALUE 的容量。它的内部实现是一个链表
4、LinkedBlockingDeque,(基于链表的 FIFO 双端阻塞队列)
LinkedBlockingDeque 是一个由链表结构组成的双向阻塞队列,即可以从队列的两端插入和移除元素。双向队列因为多了一个操作队列的入口,在多线程同时入队时,也就减少了一半的竞争。
相比于其他阻塞队列,LinkedBlockingDeque 多了 addFirst、addLast、peekFirst、peekLast 等方法,以 first 结尾的方法,表示插入、获取或移除双端队列的第一个元素。以 last 结尾的方法,表示插入、获取或移除双端队列的最后一个元素。
LinkedBlockingDeque 是可选容量的,在初始化时可以设置容量防止其过度膨胀,如果不设置,默认容量大小为 Integer.MAX_VALUE。
5、PriorityBlockingQueue,(带优先级的无界阻塞队列)
priorityBlockingQueue 是一个无界队列,它没有限制,在内存允许的情况下可以无限添加元素;它又是具有优先级的队列,是通过构造函数传入的对象来判断,传入的对象必须实现 comparable 接口。
6、SynchronousQueue (并发同步阻塞队列)
SynchronousQueue 是一个内部只能包含一个元素的队列。插入元素到队列的线程被阻塞,直到另一个线程从队列中获取了队列中存储的元素。同样,如果线程尝试获取元素并且当前不存在任何元素,则该线程将被阻塞,直到线程将元素插入队列。
将这个类称为队列有点夸大其词。这更像是一个点。
Was this helpful?
0 / 0