queue - 图1

ArrayBlockingQueue 阻塞队列

要指定容量,可以设置fair(等待最长的先处理),先block的先take。默认为非公平锁(new ReentrantLock(fair);

为了避免出队移动,通过index来模拟环形结构。
image.png
Java 并发编程—ArrayBlockingQueue - 掘金

LinkedBlockingQueue阻塞队列

以上两个是BlockingQueue,要阻塞的。

LinkedBlockingQueue和ArrayBlockingQueue区别

LinkedBlockingQueue有两个锁 (头尾采用两把锁,存取并行),ArrayBlockingQueue只有一个锁(锁全部),LinkedBlockingQueue效率高。

ConcurrentLinkedQueue 非阻塞队列

  • 实现了无锁的 poll() 和 offer()【cas】
  • size() 是通过遍历 queue 来获得的, 在效率上是 O(n),可用isEmpty()

    PriorityBlockingQueue:优先队列(阻塞队列)

    SynchronousQueue:同步队列(阻塞队列)【当面交换】

    它是一个没有容量的“队列”

    LinkedTransferQueue:链表同步队列【当面交换中心,多个线程阻塞队列(每个节点都是一个阻塞线程)】

    队列中永远只有一种类型的操作,要么是 put 类型, 要么是 take 类型.
    **queue - 图3

  • 并发编程—— LinkedTransferQueue - 掘金

Deque【双端队列】

LinkedBlockingDeque

ConcurrentLinkedDeque