LinkedBlockingQueue

Linked Blocking Queue介绍

Linked Blocking Queue是一个单向链表实现的阻塞队列。该队列按 FIFO(先进先出)排序元素,新元素插入到队列的尾部,并且队列获取操作会获得位于队列头部的元素。Linked Blocking Queue还是可选容量的(防止过度膨胀),即可以指定队列的容量。如果不指定,默认容量大小等于Integer.MAX_VALUE。

Linked Blocking Queue的结构

LinkedBlockingQueue_第1张图片
Paste_Image.png

LinkedBlockingQueue源码分析

创建 LinkedBlockingQueue(int capacity)
添加 offer(E e) 将元素E添加到队列的末尾。

LinkedBlockingQueue_第2张图片
Paste_Image.png

signalNotEmpty()的作用是唤醒notEmpty上的等待线程。

取出take()取出并返回队列的头。若队列为空,则一直等待。

LinkedBlockingQueue_第3张图片
Paste_Image.png

dequeue()的作用就是删除队列的头节点,并将表头指向“原头节点的下一个节点”。
}
signalNotFull()的作用就是唤醒notFull上的等待线程。

遍历iterator()返回一个Iter对象。

LinkedBlockingQueue_第4张图片
Paste_Image.png
LinkedBlockingQueue_第5张图片
Paste_Image.png

1 LinkedBlockingQueue继承于AbstractQueue,它本质上是一个FIFO(先进先出)的队列。
2 LinkedBlockingQueue实现了BlockingQueue接口,它支持多线程并发。当多线程竞争同一个资源时,某线程获取到该资源之后,其它线程需要阻塞等待。
3 LinkedBlockingQueue是通过单链表实现的。
head是链表的表头。取出数据时,都是从表头head处插入。
last是链表的表尾。新增数据时,都是从表尾last处插入。
count是链表的实际大小,即当前链表中包含的节点个数。
capacity是列表的容量,它是在创建链表时指定的。
putLock是插入锁,takeLock是取出锁;notEmpty是“非空条件”,notFull是“未满条件”。通 过它们对链表进行并发控制。

你可能感兴趣的:(LinkedBlockingQueue)