当前位置:网站首页>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();
}
}
边栏推荐
- 《二》标签
- Weebly mobile website editor mobile browsing New Era
- 腾讯云数据库公有云市场稳居TOP 2!
- 第一篇论文的写作流程
- 使用Thread类和Runnable接口实现多线程的区别
- 高数中值定理总结
- Basic knowledge of road loss of 3GPP channel model
- Flask project uses flask socketio exception: typeerror: function() argument 1 must be code, not str
- 01 machine learning related regulations
- 【PHP SPL笔记】
猜你喜欢
y58.第三章 Kubernetes从入门到精通 -- 持续集成与部署(三一)
AttributeError: module ‘torch._C‘ has no attribute ‘_cuda_setDevice‘
基于Bevy游戏引擎和FPGA的双人游戏
Pointer and array are input in function to realize reverse order output
U++ game learning notes
《四》表单
3GPP信道模型路损基础知识
Operand of null-aware operation ‘!‘ has type ‘SchedulerBinding‘ which excludes null.
U++4 interface learning notes
01机器学习相关规定
随机推荐
【愚公系列】2022年7月 Go教学课程 005-变量
Comparison between thread and runnable in creating threads
When knative meets webassembly
动态生成表格
最全常用高数公式
Understand common network i/o models
[Android kotlin collaboration] use coroutinecontext to realize the retry logic after a network request fails
A simple and beautiful regression table is produced in one line of code~
Meow, come, come: do you really know if, if else
pmp真的有用吗?
最长公共子序列(LCS)(动态规划,递归)
npm ERR! 400 Bad Request - PUT xxx - “devDependencies“ dep “xx“ is not a valid dependency name
【最佳网页宽度及其实现】「建议收藏」
接口间调用为什么要用json、fastjson怎么赋值的、fastjson [email protected]映射关系问题
JS 的 try catch finally 中 return 的执行顺序
Redis如何实现多可用区?
Common Oracle SQL statements
IMS data channel concept of 5g vonr+
Thread和Runnable创建线程的方式对比
[Yugong series] go teaching course 005 variables in July 2022