默认情况下不保证线程公平的访问队列,保证公平性会降低吞吐量。访问者的公平性是使用重入锁实现的。
按照先进先出的原则对元素进行排序。
默认情况下,元素采用自然顺序升序排列,但不能保证同优先级元素的排序。
队列使用PriorityQueue来实现,队列中的元素必须实现Delayed接口。
1.在对象创建的时候,初始化基本数据。
2.实现getDelay方法,该方法返回当前元素还需要延时多长时间,单位是纳秒。
3.实现compareTo()方法来指定元素的顺序。
使用场景:
1.缓存系统的设计
2.定时任务调度
每一个put操作必须等待一个take操作,否则不能继续添加元素。他可看成一个传球手,生产者的数据传送给消费者线程。吞吐量高于LinkedBlockingQueue和ArrayBlockingQueue。
6.LinkedTransferQueue:链表结构组成的无界阻塞TransferQueue队列。相对于其他阻塞队列,多了tryTransfer和transfer方法。tryTransfer方法无论消费者是否接收,方法立即返回,而transfer方法是必须等到消费者消费了才返回。除了超时机制。
7.LinkedBlockingQueue:链表结构组成的双向阻塞队列,在多线程同时入队时减少了一半的竞争。add方法等同于addlast,remove方法等同于removeFirst,take等同于takeFirst.可以运用在“工作窃取”中。
2.阻塞队列的实现原理
使用通知模式实现:ArrayBlockingQueue使用了Condition来实现。插入一个元素时队列不可用,阻塞生产者主要通过LockSupport.park(this)来实现。park(this)的源码是用setBlocker先保存一下将要阻塞的线程,然后调用unsafe.park阻塞当前线程。unsafe。park源码如下;
public native void park(boolean isAbsolute,long time);
注:相对时间是时间间隔,后面参数单位为纳秒,绝对时间是时间点,后面参数单位是毫秒。看看jvm中如何实现park方法:linux下实现系统方法pthread_cond_wait实现,在windows下是使用WaitForSingleObject实现的。