当前位置:网站首页>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();
}
}
边栏推荐
猜你喜欢
Error: No named parameter with the name ‘foregroundColor‘
Ansible overview and module explanation (you just passed today, but yesterday came to your face)
Ansible概述和模块解释(你刚走过了今天,而扑面而来的却是昨天)
How to choose an offer and what factors should be considered
Longest palindrome substring (dynamic programming)
[Yugong series] go teaching course 005 variables in July 2022
Flask project uses flask socketio exception: typeerror: function() argument 1 must be code, not str
Monitoring cannot be started after Oracle modifies the computer name
- [email protected] Mapping relatio"/>
Why JSON is used for calls between interfaces, how fastjson is assigned, fastjson 1.2 [email protected] Mapping relatio
01机器学习相关规定
随机推荐
想要选择一些部门优先使用 OKR, 应该如何选择试点部门?
Mysql database (basic)
Full link voltage test: the dispute between shadow database and shadow table
PLC模拟量输出 模拟量输出FB analog2NDA(三菱FX3U)
[736. LISP syntax parsing]
装饰器基础学习02
Monitoring cannot be started after Oracle modifies the computer name
2039: [Bluebridge cup 2022 preliminaries] Li Bai's enhanced version (dynamic planning)
带你遨游银河系的 10 种分布式数据库
如何设计 API 接口,实现统一格式返回?
sublime使用技巧
Auto. JS get all app names of mobile phones
How to design API interface and realize unified format return?
【最佳网页宽度及其实现】「建议收藏」
y58.第三章 Kubernetes从入门到精通 -- 持续集成与部署(三一)
Addressable 预下载
IMS data channel concept of 5g vonr+
Ansible报错:“msg“: “Invalid/incorrect password: Permission denied, please try again.“
sublime使用技巧
【PHP SPL笔记】