当前位置:网站首页>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();
}
}
边栏推荐
- 与利润无关的背包问题(深度优先搜索)
- 为什么很多人对技术债务产生误解
- pmp真的有用吗?
- How to design API interface and realize unified format return?
- R descriptive statistics and hypothesis testing
- STM32F103实现IAP在线升级应用程序
- National meteorological data / rainfall distribution data / solar radiation data /npp net primary productivity data / vegetation coverage data
- y58.第三章 Kubernetes从入门到精通 -- 持续集成与部署(三一)
- 一文搞懂常见的网络I/O模型
- 第一篇论文的写作流程
猜你喜欢
随机推荐
3GPP信道模型路损基础知识
一个酷酷的“幽灵”控制台工具
Leetcode minimum difference in student scores
Why is the salary of test and development so high?
PMP证书有没有必要续期?
如何设计 API 接口,实现统一格式返回?
App embedded H5 --- iPhone soft keyboard blocks input text
app内嵌h5---iphone软键盘遮挡输入文字
拿到PMP认证带来什么改变?
【二叉树】二叉树寻路
【QT】自定义控件-Loading
How to design API interface and realize unified format return?
U++ game learning notes
No experts! Growth secrets for junior and intermediate programmers and "quasi programmers" who are still practicing in Universities
[ArcGIS tutorial] thematic map production - population density distribution map - population density analysis
DBSync新增对MongoDB、ES的支持
The most complete learning rate adjustment strategy in history LR_ scheduler
史上最全学习率调整策略lr_scheduler
STM32F103ZE+SHT30检测环境温度与湿度(IIC模拟时序)
【问道】编译原理