当前位置:网站首页>Linkedblockingqueue source code analysis - initialization
Linkedblockingqueue source code analysis - initialization
2022-07-07 05:13:00 【InfoQ】
LinkedBlockingQueue characteristic
- Blocking queue based on linked list , The underlying data structure is a linked list
- First in first out queue based on linked list , New elements at the end of the team , Get the elements from the team head
- The size of the linked list can be set during initialization , The default is Integer The maximum of
- have access to Iterator To iterate
attribute
public class LinkedBlockingQueue<E> extends AbstractQueue<E>
implements BlockingQueue<E>, java.io.Serializable {
private static final long serialVersionUID = -6903933977591709194L;
/**
* Linked list node class
*/
static class Node<E> {
E item;
/**
* One of:
* - the real successor Node
* - this Node, meaning the successor is head.next
* - null, meaning there is no successor (this is the last node)
*/
Node<E> next;
Node(E x) { item = x; }
}
/** The capacity bound, or Integer.MAX_VALUE if none */
private final int capacity;
/** Current number of elements */
private final AtomicInteger count = new AtomicInteger();
/**
* Head of linked list.
* Invariant: head.item == null
*/
transient Node<E> head;
/**
* Tail of linked list.
* Invariant: last.next == null
*/
private transient Node<E> last;
/** Lock held by take, poll, etc */
private final ReentrantLock takeLock = new ReentrantLock();
/** Wait queue for waiting takes */
private final Condition notEmpty = takeLock.newCondition();
/** Lock held by put, offer, etc */
private final ReentrantLock putLock = new ReentrantLock();
/** Wait queue for waiting puts */
private final Condition notFull = putLock.newCondition();
......
}
static class Node<E>Node<E> next;private final int capacity;private final AtomicInteger count = new AtomicInteger();transient Node<E> head;private transient Node<E> last;private final ReentrantLock takeLock = new ReentrantLock();private final Condition notEmpty = takeLock.newCondition();private final ReentrantLock putLock = new ReentrantLock();private final Condition notFull = putLock.newCondition();initialization
public LinkedBlockingQueue() {
this(Integer.MAX_VALUE);
}
public LinkedBlockingQueue(int capacity) {
if (capacity <= 0) throw new IllegalArgumentException();
this.capacity = capacity;
last = head = new Node<E>(null);
}
public LinkedBlockingQueue(Collection<? extends E> c) {
this(Integer.MAX_VALUE);
final ReentrantLock putLock = this.putLock;
putLock.lock(); // Never contended, but necessary for visibility
try {
int n = 0;
for (E e : c) {
if (e == null)
throw new NullPointerException();
if (n == capacity)
throw new IllegalStateException("Queue full");
enqueue(new Node<E>(e));
++n;
}
count.set(n);
} finally {
putLock.unlock();
}
}
边栏推荐
猜你喜欢

pmp真的有用吗?

AttributeError: module ‘torch._ C‘ has no attribute ‘_ cuda_ setDevice‘

带你遨游银河系的 10 种分布式数据库

一文搞懂常见的网络I/O模型

torch optimizer小解析

Why do many people misunderstand technical debt

Window scheduled tasks

Weebly mobile website editor mobile browsing New Era

高手勿进!写给初中级程序员以及还在大学修炼的“准程序员”的成长秘籍

The sooner you understand the four rules of life, the more blessed you will be
随机推荐
IMS data channel concept of 5g vonr+
为什么很多人对技术债务产生误解
pmp真的有用吗?
创始人负债10亿,开课吧即将“下课”?
全链路压测:影子库与影子表之争
sublime使用技巧
Ansible overview and module explanation (you just passed today, but yesterday came to your face)
《二》标签
Weebly移动端网站编辑器 手机浏览新时代
If you‘re running pod install manually, make sure flutter pub get is executed first.
线程池的创建与使用
Knapsack problem (01 knapsack, complete knapsack, dynamic programming)
与利润无关的背包问题(深度优先搜索)
How to choose an offer and what factors should be considered
2039: [Bluebridge cup 2022 preliminaries] Li Bai's enhanced version (dynamic planning)
Servicemesh mainly solves three pain points
Ansible reports an error: "MSG": "invalid/incorrect password: permission denied, please try again“
Monitoring cannot be started after Oracle modifies the computer name
最长不下降子序列(LIS)(动态规划)
Auto.js 获取手机所有app名字