立正、稍息、入"ArrayBlockingQueue"(下)

简介: 大家好,我是指北君。在前面的文章中,已经对 ArrayBlockingQueue 进行了一次源码分析,对它的核心源码做了分析,今天来解析一波同为 BlockingQueue 家族中的一员的 LinkedBlockingQueue。它的底层基于单向链表实现。

poll(long timeout, TimeUnit unit)47.png48.png


poll(long timeout, TimeUnit unit) 方法是在一定时间内出队还未取到元素就阻塞线程,时间到了还没取到元素就返回 null,并不会一直阻塞线程。


take()


49.png

take() 方法和 poll() 最大的不同就是在空队列的时候会一直阻塞线程,poll() 则返回 null,poll(long timeout, TimeUnit unit) 则在一定时间内阻塞线程,超时后返回的 null。


remove()

50.png51.png


remove() 并不会弹出元素,它是删除一个元素。遍历整个单向链表,找到需要删除的元素后,将元素前一个节点的next 指向删除元素的 next。将需要删除的元素设置为 null。


peek()


52.png

peek() 方法仅仅是取出第一个元素,没有修改节点的任何一个 next 属性,所以并不会将元素从队列中移除。


出队总结

LinkedBlockingQueue 的出队一共有 poll()、take()、poll(long timeout, TimeUnit unit) 三种方法,移除元素用 remove() 方法,取出第一个元素用 peek() 方法。

出队方法在遇到空队列的时候操作不同:

  1. poll() 方法遇到空队列就返回 null。
  2. take() 方法遇到空队列就将线程加入到 notEmpty 条件队列中并且阻塞线程。
  3. poll(long timeout, TimeUnit unit) 方法在遇到空队列就阻塞一段时间,这期间没获取到元素就返回 null。


总结


  1. LinkedBlockingQueue 是基于单向链表的,线程安全的。
  2. 是一个有界的队列,最大的容量是最大的 int 值。
  3. 出队入队基于两把锁。互不阻塞。

LinkedBlockingQueue 被用在线程池中,也可以用在生产者-消费者模式中。

53.png

我是指北君,操千曲而后晓声,观千剑而后识器。感谢各位人才的:点赞、收藏和评论,我们下期更精彩!

相关文章
|
存储 安全 Java
ArrayBlockingQueue 和 LinkedBlockingQueue 有什么区别?
ArrayBlockingQueue 和 LinkedBlockingQueue 有什么区别?
|
6月前
|
算法
LinkedBlockingQueue
LinkedBlockingQueue
51 0
阻塞队列BlockingQueue
阻塞队列BlockingQueue
63 0
阻塞队列BlockingQueue
|
存储 缓存 安全
JUC之阻塞队列解读(BlockingQueue)
JUC之阻塞队列解读(BlockingQueue)
|
算法
BlockingQueue二
接着上篇BlockingQueue没讲完的 LinkedTransferQueue LinkedTransferQueue是一个由链表结构组成的无界阻塞队列,相对于其它阻塞队列,LinkedBlockingQueue可以算是LinkedBlockingQueue与SynhronoousQueue结合,LinkedtransferQueue是一种无界阻塞队列,底层基于单链表实现,其内部结构分为数据节点、请求节点,基于CAS无锁算法实现
136 0
BlockingQueue二
|
缓存 安全 Java
JUC系列学习(四):线程池阻塞队列BlockingQueue及其相关实现ArrayBlockingQueue、LinkedBlockingQueue
线程池阻塞队列BlockingQueue及其相关实现ArrayBlockingQueue、LinkedBlockingQueue
128 0
|
存储 Java 索引
BlockingQueue
网上看了好多文章将线程池的但是似乎都没的多少人会详细讲解里面的任务队列,所以只有自己动手学习其中的任务队列 BlockingQueue
3081 0
BlockingQueue
|
消息中间件 存储 Java
阻塞队列 BlockingQueue
学数据结构时学过队列,特点是FIFO,先进先出。那么什么阻塞队列呢?一起来看看。
阻塞队列 BlockingQueue
|
存储 缓存 安全
BlockingQueue 阻塞队列详解(上)
BlockingQueue 是一个 Queue , 它是一个线程安全的阻塞队列接口。 ​
326 0
BlockingQueue 阻塞队列详解(上)
立正、稍息、入"ArrayBlockingQueue"(中)
大家好,我是指北君。 在前面的文章中,已经对 ArrayBlockingQueue 进行了一次源码分析,对它的核心源码做了分析,今天来解析一波同为 BlockingQueue 家族中的一员的 LinkedBlockingQueue。它的底层基于单向链表实现。
立正、稍息、入"ArrayBlockingQueue"(中)