以下内容整理自互联网,仅用于个人学习
BlockingQueue
BlockingQueue接口定义了一种阻塞的FIFO queue,每一个BlockingQueue都有一个容量。当容量满时,往BlockingQueue中添加数据时会造成阻塞,当容量为空时,取元素操作会阻塞。
BlockingQueue的两个实现类
-
ArrayBlockingQueue
1.一个由数组支持的有界阻塞队列。
2.按先进先出原则排序。
3.一旦创建好这个数组,就不能再增加其容量。
4.试图向已满的队列中放入元素会导致操作受阻塞。
5.试图从空的队列中提取元素将导致类似的阻塞。 -
LinkedBlockingQueue
1.LinkedBlockingQueue是一个基于已链接节点的、范围任意的blocking queue的实现
2.此队列按FIFO(先进先出)排序元素。队列的头部 是在队列中时间最长的元素。队列的尾部 是在队列中时间最短的元素
3.新元素插入到队列的尾部,并且队列检索操作会获得位于队列头部的元素。链接队列的吞吐量通常要高于基于数组的队列,但是在大多数并发应用程序中,其可预知的性能要低。
4.可选的容量范围构造方法参数作为防止队列过度扩展的一种方法。
5.如果未指定容量,则它等于Integer.MAX_VALUE。除非插入节点会使队列超出容量,否则每次插入后会动态地创建链接节点 ,容量范围可以在构造方法参数中指定作为防止队列过度扩展。
6.此对象是 线程阻塞-安全的
7.不接受null元素
8.实现了Collection和Iterator接口的所有可选 方法
二者区别:
- 队列中锁的实现不同
ArrayBlockingQueue实现的队列中的锁是没有分离的,即生产和消费用的是同一个锁;
LinkedBlockingQueue实现的队列中的锁是分离的,即生产用的是putLock,消费是takeLock - 在生产或消费时操作不同
ArrayBlockingQueue实现的队列中在生产和消费的时候,是直接将枚举对象插入或移除的;
LinkedBlockingQueue实现的队列中在生产和消费的时候,需要把枚举对象转换为Node<E>进行插入或移除,会影响性能 - 队列大小初始化方式不同
ArrayBlockingQueue实现的队列中必须指定队列的大小;
LinkedBlockingQueue实现的队列中可以不指定队列的大小,但是默认是Integer.MAX_VALUE
CountDownLatch
一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。主要方法:
- public CountDownLatch(count);
- public void countDown();
- public void await() ;
构造方法指定了计数的次数。countDown方法,当前线程调用此方法则计数减一。await方法,调用该方法会一直阻塞当前线程,直到计时器的值为0。
.
网友评论