当前位置:网站首页>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]所创,转载请带上原文链接,感谢
边栏推荐
- Aprelu: cross border application, adaptive relu | IEEE tie 2020 for machine fault detection
- ES6 essence:
- Using consult to realize service discovery: instance ID customization
- Basic principle and application of iptables
- DevOps是什么
- 3分钟读懂Wi-Fi 6于Wi-Fi 5的优势
- 中国提出的AI方法影响越来越大,天大等从大量文献中挖掘AI发展规律
- 嘘!异步事件这样用真的好么?
- hadoop 命令总结
- 【效能優化】納尼?記憶體又溢位了?!是時候總結一波了!!
猜你喜欢
Grouping operation aligned with specified datum
How to select the evaluation index of classification model
Kitty中的动态线程池支持Nacos,Apollo多配置中心了
This article will introduce you to jest unit test
Do not understand UML class diagram? Take a look at this edition of rural love class diagram, a learn!
中国提出的AI方法影响越来越大,天大等从大量文献中挖掘AI发展规律
使用 Iceberg on Kubernetes 打造新一代云原生数据湖
Don't go! Here is a note: picture and text to explain AQS, let's have a look at the source code of AQS (long text)
Just now, I popularized two unique skills of login to Xuemei
C++和C++程序员快要被市场淘汰了
随机推荐
Use of vuepress
[performance optimization] Nani? Memory overflow again?! It's time to sum up the wave!!
Python + appium automatic operation wechat is enough
Keyboard entry lottery random draw
容联完成1.25亿美元F轮融资
2018中国云厂商TOP5:阿里云、腾讯云、AWS、电信、联通 ...
Programmer introspection checklist
全球疫情加速互联网企业转型,区块链会是解药吗?
DTU连接经常遇到的问题有哪些
带你学习ES5中新增的方法
CCR炒币机器人:“比特币”数字货币的大佬,你不得不了解的知识
TRON智能钱包PHP开发包【零TRX归集】
Nodejs crawler captures ancient books and records, a total of 16000 pages, experience summary and project sharing
Just now, I popularized two unique skills of login to Xuemei
Flink的DataSource三部曲之二:内置connector
采购供应商系统是什么?采购供应商管理平台解决方案
如何将数据变成资产?吸引数据科学家
选择站群服务器的有哪些标准呢?
Filecoin主网上线以来Filecoin矿机扇区密封到底是什么意思
嘗試從零開始構建我的商城 (二) :使用JWT保護我們的資訊保安,完善Swagger配置