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

全链路压测:影子库与影子表之争

《二》标签

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

Basic knowledge of road loss of 3GPP channel model

Ansible中的inventory主机清单(预祝你我有数不尽的鲜花和浪漫)

If you‘re running pod install manually, make sure flutter pub get is executed first.

JS also exports Excel

Auto.js 获取手机所有app名字

【二叉树】二叉树寻路

Flask项目使用flask-socketio异常:TypeError: function() argument 1 must be code, not str
随机推荐
R descriptive statistics and hypothesis testing
Ansible overview and module explanation (you just passed today, but yesterday came to your face)
《二》标签
C语言中函数指针与指针函数
AttributeError: module ‘torch._ C‘ has no attribute ‘_ cuda_ setDevice‘
2. Overview of securities investment funds
STM32F103ZE+SHT30检测环境温度与湿度(IIC模拟时序)
第一篇论文的写作流程
Ansible概述和模块解释(你刚走过了今天,而扑面而来的却是昨天)
最全常用高数公式
Common Oracle SQL statements
Operand of null-aware operation ‘!‘ has type ‘SchedulerBinding‘ which excludes null.
ThinkPHP关联预载入with
U++ 元数据说明符 学习笔记
01 machine learning related regulations
Addressable 预下载
腾讯云数据库公有云市场稳居TOP 2!
ServiceMesh主要解决的三大痛点
为什么很多人对技术债务产生误解
App embedded H5 --- iPhone soft keyboard blocks input text