当前位置:网站首页>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();
}
}
边栏推荐
猜你喜欢

使用知云阅读器翻译统计遗传学书籍

Sublime tips

为什么很多人对技术债务产生误解

Monitoring cannot be started after Oracle modifies the computer name

U++4 interface learning notes

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

Function pointer and pointer function in C language

LabVIEW在打开一个新的引用,提示内存已满

Time complexity & space complexity

Decorator basic learning 02
随机推荐
3.基金的类型
Clickhouse (03) how to install and deploy Clickhouse
Full link voltage test: the dispute between shadow database and shadow table
JS variable
App embedded H5 --- iPhone soft keyboard blocks input text
Ansible overview and module explanation (you just passed today, but yesterday came to your face)
PMP证书有没有必要续期?
接口间调用为什么要用json、fastjson怎么赋值的、fastjson [email protected]映射关系问题
线程同步的两个方法
How to choose an offer and what factors should be considered
JS variable case output user name
Error: No named parameter with the name ‘foregroundColor‘
批量归一化(标准化)处理
【问道】编译原理
torch optimizer小解析
Operand of null-aware operation ‘!‘ has type ‘SchedulerBinding‘ which excludes null.
If you‘re running pod install manually, make sure flutter pub get is executed first.
高数中值定理总结
Using thread class and runnable interface to realize the difference between multithreading
Array initialization of local variables