linkedblockingqueue在java中的原理

我们在说队列顺序的时候,linkedblockingqueue先进先出的顺序,显示和我们常规的先进再出的理念有所不同。这里我们需要深入到linkedblockingqueue的原理中,去讨论这种顺序机制的存在。接下来我们会从其主要属性、构造函数以及继承结构中,为大家找寻linkedblockingqueu的原理。

1.主要属性

//容量
privatefinalintcapacity;

//元素数量
privatefinalAtomicIntegercount=newAtomicInteger();

//链表头
transientNode<E>head;

//链表尾
privatetransientNode<E>last;

//take锁
privatefinalReentrantLocktakeLock=newReentrantLock();

//notEmpty条件
//当队列无元素时,take锁会阻塞在notEmpty条件上,等待其它线程唤醒
privatefinalConditionnotEmpty=takeLock.newCondition();

//放锁
privatefinalReentrantLockputLock=newReentrantLock();

//notFull条件
//当队列满了时,put锁会会阻塞在notFull上,等待其它线程唤醒
privatefinalConditionnotFull=putLock.newCondition();

1)capacity,有容量,可以理解为LinkedBlockingQueue是有界队列

2)head, last,链表头、链表尾指针

3)takeLock,notEmpty,take锁及其对应的条件

4)putLock, notFull,put锁及其对应的条件

(5)入队、出队使用两个不同的锁控制,锁分离,提高效率

2.构造函数

publicLinkedBlockingQueue(){
this(Integer.MAX_VALUE);
}

//限制队列容量,并初始化队列的head和last节点.
publicLinkedBlockingQueue(intcapacity){
if(capacity<=0)thrownewIllegalArgumentException();
this.capacity=capacity;
last=head=newNode<E>(null);
}

//LinkedBlockingQueue(intcapacity)初始化,然后加写锁,将集合c一个个入队.
publicLinkedBlockingQueue(Collection<?extendsE>c){
this(Integer.MAX_VALUE);
finalReentrantLockputLock=this.putLock;
putLock.lock();//写锁(以重入锁实现,对队尾的插入进行控制)
try{
intn=0;
for(Ee:c){
	//null元素抛出异常
if(e==null)
thrownewNullPointerException();
if(n==capacity)
thrownewIllegalStateException("Queuefull");
enqueue(newNode<E>(e));//将元素封装成Node,入队
++n;
}
count.set(n);
}finally{
putLock.unlock();//释放
}
}

3.继承结构

原文来自:https://www.py.cn

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容