本文聊一下 JUC 下的 LinkedBlockingQueue 队列,先说说 LinkedBlockingQueue 队列的特点,然后再从源码的角度聊一聊 LinkedBlockingQueue 的主要实现~
LinkedBlockingQueue 有以下特点:
- LinkedBlockingQueue 是阻塞队列,底层是单链表实现的~
- 元素从队列尾进队,从队列头出队,符合FIFO~
- 可以使用 Collection 和 Iterator 两个接口的所有操作,因为实现了两者的接口~
- LinkedBlockingQueue 队列读写操作都加了锁,但是读写用的是两把不同的锁,所以可以同时读写操作~
LinkedBlockingQueue 队列继承了 AbstractQueue
类,实现了 BlockingQueue
接口,LinkedBlockingQueue 主要有以下接口:
1 | 复制代码//将指定的元素插入到此队列的尾部(如果立即可行且不会超过该队列的容量) |
LinkedBlockingQueue 队列的读写方法非常的多,但是常用的是 put()
、take()
方法,因为它们两是阻塞的,所以我们就从源码的角度来聊一聊 LinkedBlockingQueue 队列中这两个方法的实现。
先来看看 put()
方法,源码如下:
1 | 复制代码public void put(E e) throws InterruptedException { |
put()
方法的源码并不难,非常容易就看懂,put()
方法的过程大概如下:
- 1、先加锁,保证容器的并发安全~
- 2、队列新增数据,将数据追加到队列尾部~
- 3、新增时,如果队列满了,当前线程是会被阻塞的,等待被唤醒~
- 4、新增数据成功后,在适当时机,会唤起 put 的等待线程(队列不满时),或者 take 的等待线程(队列不为空时),这样保证队列一旦满足 put 或者 take 条件时,立马就能唤起阻塞线程,继续运行,保证了唤起的时机不被浪费offer 就有两两种,一种是直接返回 false,另一种是超过一定时间后返回 false~
- 5、释放锁~
其他的新增方法,例如 offer
,可以查看源码,跟put()
方法大同小异,相差不大~
再来看看 take()
方法,源码如下:
1 | 复制代码public E take() throws InterruptedException { |
take()
方法跟 put()
方法类似,是一个相反的操作,我就不做过多的说明了~
以上就是 LinkedBlockingQueue 队列的简单源码解析,希望对你的面试或者工作有所帮助,感谢你的阅读~
欢迎关注公众号【互联网平头哥】,一起成长,一起进步~。
本文转载自: 掘金