当前位置:网站首页>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]所创,转载请带上原文链接,感谢
边栏推荐
- 连肝三个通宵,JVM77道高频面试题详细分析,就这?
- hadoop 命令总结
- 至联云分享:IPFS/Filecoin值不值得投资?
- CCR炒币机器人:“比特币”数字货币的大佬,你不得不了解的知识
- 大数据应用的重要性体现在方方面面
- H5 makes its own video player (JS Part 2)
- 事半功倍:在没有机柜的情况下实现自动化
- Network security engineer Demo: the original * * is to get your computer administrator rights! 【***】
- 中小微企业选择共享办公室怎么样?
- Why do private enterprises do party building? ——Special subject study of geek state holding Party branch
猜你喜欢
随机推荐
Just now, I popularized two unique skills of login to Xuemei
加速「全民直播」洪流,如何攻克延时、卡顿、高并发难题?
Leetcode's ransom letter
Real time data synchronization scheme based on Flink SQL CDC
事半功倍:在没有机柜的情况下实现自动化
ES6 essence:
How long does it take you to work out an object-oriented programming interview question from Ali school?
嘘!异步事件这样用真的好么?
连肝三个通宵,JVM77道高频面试题详细分析,就这?
Vuejs development specification
多机器人行情共享解决方案
WeihanLi.Npoi 1.11.0/1.12.0 Release Notes
2019年的一个小目标,成为csdn的博客专家,纪念一下
Python3 e-learning case 4: writing web proxy
Flink on paasta: yelp's new stream processing platform running on kubernetes
Let the front-end siege division develop independently from the back-end: Mock.js
人工智能学什么课程?它将替代人类工作?
The practice of the architecture of Internet public opinion system
Grouping operation aligned with specified datum
Skywalking series blog 1 - install stand-alone skywalking