Linked Blocking Queue介绍
Linked Blocking Queue是一个单向链表实现的阻塞队列。该队列按 FIFO(先进先出)排序元素,新元素插入到队列的尾部,并且队列获取操作会获得位于队列头部的元素。Linked Blocking Queue还是可选容量的(防止过度膨胀),即可以指定队列的容量。如果不指定,默认容量大小等于Integer.MAX_VALUE。
Linked Blocking Queue的结构
Paste_Image.pngLinkedBlockingQueue源码分析
创建 LinkedBlockingQueue(int capacity)
添加 offer(E e) 将元素E添加到队列的末尾。
signalNotEmpty()的作用是唤醒notEmpty上的等待线程。
取出take()取出并返回队列的头。若队列为空,则一直等待。
Paste_Image.pngdequeue()的作用就是删除队列的头节点,并将表头指向“原头节点的下一个节点”。
}
signalNotFull()的作用就是唤醒notFull上的等待线程。
遍历iterator()返回一个Iter对象。
Paste_Image.png Paste_Image.png1 LinkedBlockingQueue继承于AbstractQueue,它本质上是一个FIFO(先进先出)的队列。
2 LinkedBlockingQueue实现了BlockingQueue接口,它支持多线程并发。当多线程竞争同一个资源时,某线程获取到该资源之后,其它线程需要阻塞等待。
3 LinkedBlockingQueue是通过单链表实现的。
head是链表的表头。取出数据时,都是从表头head处插入。
last是链表的表尾。新增数据时,都是从表尾last处插入。
count是链表的实际大小,即当前链表中包含的节点个数。
capacity是列表的容量,它是在创建链表时指定的。
putLock是插入锁,takeLock是取出锁;notEmpty是“非空条件”,notFull是“未满条件”。通 过它们对链表进行并发控制。
网友评论