当前位置:网站首页>Linked blocking Queue Analysis of blocking queue
Linked blocking Queue Analysis of blocking queue
2020-11-06 01:18:00 【Clamhub's blog】
1、 Five kinds of blocking queues are introduced
- ArrayBlockingQueue
Bounded queues , The bottom layer is implemented by array , Concurrent control use ReentrantLock control , Whether it's an insert operation or a read operation , You need to get the lock before you can execute . - LinkedBlockingQueue
The bottom layer is based on one-way linked list , It can be regarded as a bounded queue , It can also be used as an unbounded queue . Use two ReentrantLock Implement concurrency control :takelock and putlock. - SynchronousQueue
The bottom layer uses one-way linked list , There's only one element , Synchronization means that a write operation must wait for a read operation to return , It refers to the synchronization of read-write threads . - PriorityBlockingQueue
Implementation of blocking queue with sorting , Using arrays to implement . Concurrent control use ReentrantLock, The queue is unbounded .
There are initialization parameters to specify the size of the queue , But it will automatically expand . Using the smallest heap for sorting . - DelayedQueue
DelayedQueue It's using PriorityBlockingQueue and Delayed Realized , A priority queue is defined internally , When calling offer When , hold Delayed Objects are added to the queue , Use take The first first Take the object out (peek), If you don't reach the threshold , Conduct await Handle .
2、poll and peek The difference between
Are used to get the header of the queue ,poll The header node will be deleted ,peek The header node will not be deleted .
3、LinkedBlockingQueue
- It's the first in, first out line FIFO.
- use ReentrantLock Ensure thread safety
3.1、 function
3.1.1、 increase
There are three ways to increase , Premise : The queue is full
The way | put | add | offer |
---|---|---|---|
characteristic | Keep blocking | Throw exceptions | return false |
3.1.2、 Delete
There are three ways to delete , Premise : The queue is empty
The way | remove | poll | take |
---|---|---|---|
characteristic | NoSuchElementException | return false | Blocking |
3.2、 Simple analysis
- LinkedBlockingQueue It's a blocking queue , The interior is made up of two ReentrantLock To achieve thread safety in and out of the queue , By their own Condition Object's await and signal To achieve the wait and wake function .
- Based on one-way linked list 、 The range is arbitrary ( In fact, there is a boundary )、FIFO Blocking queues .
- The head and tail nodes always point to a sentinel's node in the beginning , It doesn't hold the actual data , When there is data in the queue , The head node still points to the sentinel , The tail node points to the last node of valid data . The advantage of doing so is , And counter count After combining , The team leader 、 The visit at the end of the team can be done independently , It is not necessary to judge the relationship between the head node and the tail node .
3.2.1、 Nodes and properties
1 |
// Internal class of linked list node |
3.2.2、 Insert thread and get mutual notification of thread
signalNotEmpty() Method , Called when the insertion thread finds that the queue is empty , Tell the fetch thread to wait .
signalNotFull() Method , Called when the fetch thread finds that the queue is full , Tell the insert thread to wait .
1 |
// Said wait take.put/offer call , Otherwise, it's not usually locked takeLock. |
3.2.3、 Entry and exit operations
enqueue() Methods can only be held in putLock Lock down execution ,dequeue() In the hold takeLock Lock down execution .
1 |
// Insert... At the end of the queue |
3.2.4、 Lock and release two locks
When two locks need to be locked at the same time , Encapsulate the sequence of lock and release into methods , Make sure that everything is consistent . Moreover, the lock is not responding to the interrupt , Until the lock is successful , This prevents the first lock from being locked successfully , And the second lock failed to lock, resulting in the risk that the lock will not be released .
1 |
// lock putLock and takeLock |
3.3、 Source code interpretation
A brief introduction LinkedBlockingQueue in API Source code , Such as the construction method , newly added , obtain , Delete ,drainTo.
3.3.1、 Constructors
LinkedBlockingQueue There are three construction methods , Among them, the nonparametric structure should be used as little as possible , Because the capacity is Integer The maximum of , Improper operation will cause memory overflow .
1 |
public LinkedBlockingQueue() { |
3.3.2、offer(E e)
Set the given element to the queue , If the setting is successful, return to true, Otherwise return to false. e The value of cannot be empty , Otherwise, a null pointer exception is thrown .
1 |
// If you can insert the specified element to the end of the queue immediately without exceeding the queue capacity , Return to... After success true, If the queue is full , return false. When using a queue with limited capacity , This method is usually better than method BlockingQueue#add preferable , The latter can only insert elements by throwing exceptions . |
3.3.3、put(E e)
Set the element to the queue , If there is no extra space in the queue , This method will always block , Until there's extra space in the queue .
1 |
public void put(E e) throws InterruptedException { |
3.3.4、peek()
Non blocking gets the first element in the queue , Not out of line .
1 |
public E peek() { |
3.3.5、poll()
Non blocking access to values in the queue , Return not obtained null.
1 |
public E poll() { |
3.3.6、remove(Object o)
Removes the specified value from the queue . Lock both locks .
1 |
public boolean remove(Object o) { |
3.3.7、clear()
Clear queue .
1 |
// Atomically removes all elements from the queue . When this call returns , The queue will be empty . |
3.3.8、drainTo(Collection c)
Put the median in the queue , Remove all , Set concurrency to a given set .
1 |
public int drainTo(Collection<? super E> c, int maxElements) { |
版权声明
本文为[Clamhub's blog]所创,转载请带上原文链接,感谢
边栏推荐
- Subordination judgment in structured data
- 全球疫情加速互联网企业转型,区块链会是解药吗?
- PHPSHE 短信插件说明
- Tool class under JUC package, its name is locksupport! Did you make it?
- 制造和新的自动化技术是什么?
- Filecoin的经济模型与未来价值是如何支撑FIL币价格破千的
- Leetcode's ransom letter
- (1) ASP.NET Introduction to core3.1 Ocelot
- Filecoin主网上线以来Filecoin矿机扇区密封到底是什么意思
- Network security engineer Demo: the original * * is to get your computer administrator rights! 【***】
猜你喜欢
采购供应商系统是什么?采购供应商管理平台解决方案
Not long after graduation, he earned 20000 yuan from private work!
全球疫情加速互联网企业转型,区块链会是解药吗?
Troubleshooting and summary of JVM Metaspace memory overflow
Use of vuepress
EOS创始人BM: UE,UBI,URI有什么区别?
PN8162 20W PD快充芯片,PD快充充电器方案
人工智能学什么课程?它将替代人类工作?
“颜值经济”的野望:华熙生物净利率六连降,收购案遭上交所问询
比特币一度突破14000美元,即将面临美国大选考验
随机推荐
连肝三个通宵,JVM77道高频面试题详细分析,就这?
Examples of unconventional aggregation
Menu permission control configuration of hub plug-in for azure Devops extension
数据产品不就是报表吗?大错特错!这分类里有大学问
【效能優化】納尼?記憶體又溢位了?!是時候總結一波了!!
制造和新的自动化技术是什么?
采购供应商系统是什么?采购供应商管理平台解决方案
前端都应懂的入门基础-github基础
xmppmini 專案詳解:一步一步從原理跟我學實用 xmpp 技術開發 4.字串解碼祕笈與訊息包
你的财务报告该换个高级的套路了——财务分析驾驶舱
怎么理解Python迭代器与生成器?
“颜值经济”的野望:华熙生物净利率六连降,收购案遭上交所问询
Group count - word length
It's so embarrassing, fans broke ten thousand, used for a year!
OPTIMIZER_ Trace details
Cos start source code and creator
Skywalking series blog 1 - install stand-alone skywalking
This article will introduce you to jest unit test
Asp.Net Core學習筆記:入門篇
Filecoin主网上线以来Filecoin矿机扇区密封到底是什么意思