线程阀是一种线程与线程之间互相制约和交互的机制
Queue,Deque,BlockingQueue
Queue队列,先进先出;Deque双端队列;BlockingQueue当队列满时,存储元素的线程会等待队列非满,当队列为空时,读取元素的线程会等待队列非空。
阻塞队列方法
JDK已知阻塞队列
数组阻塞队列java.util.concurrent.ArrayBlockingQueue
链表阻塞队列java.util.concurrent.LinkedBlockingQueue
基于链表的阻塞队列,当生产者向其中存储值时,队列会从其中获取到值放入队列内部缓存,生产者立即返回,当缓存区满时,会阻塞生产队列,直到消费者消费一份数据。消费者亦是如此。
该队列生产者和消费者分别加锁,意味着生产者和消费者可以同时从队列中操作数据,适合于并发模式。
当初始化我们没有给定大小时,默认最大,如果生产者生产数据的速度高于消费者,可能会导致内存泄漏。
优先级阻塞队列java.util.concurrent.PriorityBlockingQueue
支持优先级排序的无阻塞队列,并不会阻塞生产者,只会阻塞消费者。
延时队列java.util.concurrent.DelayQueue
支持延时获取元素的使用优先级队列实现的无界阻塞队列,队列中元素必须实现DelayQueue,和Compable接口创建元素的时候可以指定多久才可以获取到。
同步队列java.util.concurrent.SynchronousQueue
同步队列没有实际内存,只是负责将生产者生产的数据传递给消费者。吞吐量较高
链表双向阻塞队列java.util.concurrent.LinkedBlockingDeque
由链表组成的双向阻塞队列
链表传输队列java.util.concurrent.LinkedTransferQueue
消费者去队列消费数据,发现队列为空,生产一个数据赋值为null,继续等待知道有生产者生产数据发现有空数据,将自己的值直接赋值给空的数据。
CountDownLatch同步计数器
一个线程等待其他线程都完成后才能继续往下走
AbstractQueuedLongSynchronizer抽象队列化同步器
Semaphore同步计数器
只允许一定数量的线程工作,其余的进行等待,完成一个线程,允许放入一个线程。
CyclicBarrier同步计数器
多个线程互相等待,所有线程到达某一点时,才能继续同时往下走