我们在说队列顺序的时候,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
暂无评论内容