当前位置:网站首页>LinkedBlockingQueue源码分析-初始化
LinkedBlockingQueue源码分析-初始化
2022-07-06 23:13:00 【InfoQ】
LinkedBlockingQueue特点
- 基于链表实现的阻塞队列,底层的数据结构为链表
- 基于链表实现先入先出的队列,新元素放在队尾,从队头部获取元素
- 链表大小在初始化的时候可以设置大小,默认为 Integer 的最大值
- 可以使用Iterator 进行迭代
属性
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();初始化
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();
}
}
边栏推荐
- AttributeError: module ‘torch._ C‘ has no attribute ‘_ cuda_ setDevice‘
- 《五》表格
- Thread和Runnable创建线程的方式对比
- Mysql database (basic)
- 2039: [蓝桥杯2022初赛] 李白打酒加强版 (动态规划)
- y58.第三章 Kubernetes从入门到精通 -- 持续集成与部署(三一)
- Comparison between thread and runnable in creating threads
- 第一篇论文的写作流程
- 01 machine learning related regulations
- Leetcode(417)——太平洋大西洋水流问题
猜你喜欢
随机推荐
JDBC link Oracle reference code
高手勿进!写给初中级程序员以及还在大学修炼的“准程序员”的成长秘籍
全链路压测:影子库与影子表之争
Gavin teacher's perception of transformer live class - rasa project actual combat e-commerce retail customer service intelligent business dialogue robot microservice code analysis and dialogue experim
HarmonyOS第四次培训
U++ metadata specifier learning notes
Techniques d'utilisation de sublime
Common Oracle SQL statements
2039: [蓝桥杯2022初赛] 李白打酒加强版 (动态规划)
Leetcode(417)——太平洋大西洋水流问题
Appium practice | make the test faster, more stable and more reliable (I): slice test
Dynamically generate tables
Basic knowledge of road loss of 3GPP channel model
当 Knative 遇见 WebAssembly
Ansible中的inventory主机清单(预祝你我有数不尽的鲜花和浪漫)
c语言神经网络基本代码大全及其含义
Ansible中的inventory主機清單(預祝你我有數不盡的鮮花和浪漫)
y58.第三章 Kubernetes从入门到精通 -- 持续集成与部署(三一)
装饰器基础学习02
Time complexity & space complexity









