当前位置:网站首页>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]所创,转载请带上原文链接,感谢
边栏推荐
- GDB除錯基礎使用方法
- 华为云“四个可靠”的方法论
- It's so embarrassing, fans broke ten thousand, used for a year!
- Calculation script for time series data
- git rebase的時候捅婁子了,怎麼辦?線上等……
- PLC模拟量输入和数字量输入是什么
- 教你轻松搞懂vue-codemirror的基本用法:主要实现代码编辑、验证提示、代码格式化
- 事半功倍:在没有机柜的情况下实现自动化
- xmppmini 專案詳解:一步一步從原理跟我學實用 xmpp 技術開發 4.字串解碼祕笈與訊息包
- How to select the evaluation index of classification model
猜你喜欢

DRF JWT authentication module and self customization

Filecoin最新动态 完成重大升级 已实现四大项目进展!

How to select the evaluation index of classification model

如何将数据变成资产?吸引数据科学家

3分钟读懂Wi-Fi 6于Wi-Fi 5的优势

熬夜总结了报表自动化、数据可视化和挖掘的要点,和你想的不一样

选择站群服务器的有哪些标准呢?

Computer TCP / IP interview 10 even asked, how many can you withstand?

Aprelu: cross border application, adaptive relu | IEEE tie 2020 for machine fault detection

Calculation script for time series data
随机推荐
WeihanLi.Npoi 1.11.0/1.12.0 Release Notes
A debate on whether flv should support hevc
中小微企业选择共享办公室怎么样?
【效能優化】納尼?記憶體又溢位了?!是時候總結一波了!!
PHP应用对接Justswap专用开发包【JustSwap.PHP】
Serilog原始碼解析——使用方法
After brushing leetcode's linked list topic, I found a secret!
How to select the evaluation index of classification model
IPFS/Filecoin合法性:保护个人隐私不被泄露
Computer TCP / IP interview 10 even asked, how many can you withstand?
How to get started with new HTML5 (2)
Vuejs development specification
(2)ASP.NET Core3.1 Ocelot路由
做外包真的很难,身为外包的我也无奈叹息。
教你轻松搞懂vue-codemirror的基本用法:主要实现代码编辑、验证提示、代码格式化
采购供应商系统是什么?采购供应商管理平台解决方案
The difference between Es5 class and ES6 class
Technical director, to just graduated programmers a word - do a good job in small things, can achieve great things
Vue 3 responsive Foundation
Not long after graduation, he earned 20000 yuan from private work!