使用数组实现的有界阻塞队列,按照先进先出(FIFO)的原则进行排序。默认情况下不保证线程公平地访问队列。
那么什么是安全?可以查看之前这篇文章
公平访问就是指阻塞的所有生产者线程或消费者线程,当队列可用时,可以按照阻塞的先后顺序访问队列。
即先阻塞的线程,先被唤醒。
使用链表的阻塞队列,和ArrayListBlockingQueue一样遵循先进先出(FIFO)的原则排序。通过内部管理一个数据缓冲队列(该队列由一个链表构成)进行存放和读取数据。当生产者往队列中放入一个数据时,队列会从生产者手中获取数据,并缓存在队列内部,而生产者立即返回;只有当队列缓冲区达到缓存容量的最大值时(构造方法指定缓冲区容量),才会阻塞生产者队列,直到消费者从队列中消费掉一份数据,生产者线程会被唤醒;消费者的队列也是一样的。相比于ArrayBlockingQueue他的优点是生产者端和消费者端分别采用了独立的锁来控制数据同步;而Arraybolckquene采用的是同一把锁,读操作和写操作不能并发执行,可以通过这个特点并行处理数据,来提高队列的并发性能。
如果构造方法汇总没有指定其容量大小,LinkedBlockingQueue会默认一个类似无限大小的容量(Integer.MAX_VALUE)。
所以如果没有指定缓冲区容量大小的话生产者的速度大于消费者的速度,也许还没有等到队列满阻塞产生,内存就已经被消耗完了。
支持优先级的无界队列。默认情况下元素采取自然顺序升序排列;自定义实现compareTo()方法来指定元素进行排序规则;或者在初始化PriorityBlockingQueue时,指定构造参数Comparator来对元素进行排序。
延时获取元素的无界阻塞队列。队列使用PriorityQueue来实现。队列中的元素必须实现 Delayed 接口。创建元素时,可以指定元素到期的时间,只有在元素到期时才能从队列中取走。所以元素不是放进去就会执行的,需要等待一定时间才会执行。