当前位置:网站首页>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]所创,转载请带上原文链接,感谢
边栏推荐
- 50 + open source projects are officially assembled, and millions of developers are voting
- 有关PDF417条码码制的结构介绍
- 使用 Iceberg on Kubernetes 打造新一代云原生数据湖
- Flink的DataSource三部曲之二:内置connector
- git rebase的時候捅婁子了,怎麼辦?線上等……
- Vue 3 responsive Foundation
- 【效能優化】納尼?記憶體又溢位了?!是時候總結一波了!!
- Analysis of react high order components
- DRF JWT authentication module and self customization
- WeihanLi.Npoi 1.11.0/1.12.0 Release Notes
猜你喜欢
Existence judgment in structured data
多机器人行情共享解决方案
Calculation script for time series data
从海外进军中国,Rancher要执容器云市场牛耳 | 爱分析调研
一时技痒,撸了个动态线程池,源码放Github了
助力金融科技创新发展,ATFX走在行业最前列
Not long after graduation, he earned 20000 yuan from private work!
ES6学习笔记(五):轻松了解ES6的内置扩展对象
业内首发车道级导航背后——详解高精定位技术演进与场景应用
Network security engineer Demo: the original * * is to get your computer administrator rights! 【***】
随机推荐
In depth understanding of the construction of Intelligent Recommendation System
华为云“四个可靠”的方法论
连肝三个通宵,JVM77道高频面试题详细分析,就这?
有关PDF417条码码制的结构介绍
GDB除錯基礎使用方法
Installing the consult cluster
嘘!异步事件这样用真的好么?
從小公司進入大廠,我都做對了哪些事?
htmlcss
Basic principle and application of iptables
做外包真的很难,身为外包的我也无奈叹息。
条码生成软件如何隐藏部分条码文字
深度揭祕垃圾回收底層,這次讓你徹底弄懂她
小程序入门到精通(二):了解小程序开发4个重要文件
It's so embarrassing, fans broke ten thousand, used for a year!
Analysis of react high order components
git rebase的時候捅婁子了,怎麼辦?線上等……
ES6 essence:
Want to do read-write separation, give you some small experience
Every day we say we need to do performance optimization. What are we optimizing?