BlockingQueue和CountDownLatch

以下内容整理自互联网,仅用于个人学习


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进行插入或移除,会影响性能
  • 队列大小初始化方式不同
    ArrayBlockingQueue实现的队列中必须指定队列的大小;
    LinkedBlockingQueue实现的队列中可以不指定队列的大小,但是默认是Integer.MAX_VALUE

CountDownLatch

一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。主要方法:

  • public CountDownLatch(count);
  • public void countDown();
  • public void await() ;

构造方法指定了计数的次数。countDown方法,当前线程调用此方法则计数减一。await方法,调用该方法会一直阻塞当前线程,直到计时器的值为0。
.

你可能感兴趣的:(BlockingQueue和CountDownLatch)