java阻塞队列

1.介绍:
一个支持两个附加操作的队列,两个附加的操作支持阻塞的插入和移除操作。
在阻塞队列不可用时,两个附加操作提供了4种处理方式:抛出异常、返回特殊值、一直阻塞和超时退出。
jdk7提供了7个阻塞队列:‘
1.ArrayBlockingQueue:数组结构组成的有界阻塞队列

              默认情况下不保证线程公平的访问队列,保证公平性会降低吞吐量。访问者的公平性是使用重入锁实现的。

2.LinkedBlockingQueue:链表结构组成的有界阻塞队列

              按照先进先出的原则对元素进行排序。

3.PriorityBlockingQueue:支持优先级排序的无界阻塞队列

              默认情况下,元素采用自然顺序升序排列,但不能保证同优先级元素的排序。

4.DelayQueue:使用优先级队列实现的无界阻塞队列

              队列使用PriorityQueue来实现,队列中的元素必须实现Delayed接口。

               1.在对象创建的时候,初始化基本数据。

               2.实现getDelay方法,该方法返回当前元素还需要延时多长时间,单位是纳秒。

               3.实现compareTo()方法来指定元素的顺序。

              使用场景:

               1.缓存系统的设计

               2.定时任务调度

5.SynchronousQueue:不存储元素的阻塞队列

               每一个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实现的。

你可能感兴趣的:(java,java)