BlockingQueue
2019-08-21 13:33:25 0 举报
BlockingQueue解析图
作者其他创作
大纲/内容
fullyRelease(Node node)释放锁
加锁lock
notFull.await()进入条件队列阻塞notFull
capacity
T1put
new ArrayBlockingQueue<Ball>(1);
是
唤醒notEmpty队列
waitStatus=-2
NodenextWaiter=Node1
进入notEmpty条件队列阻塞
enqueue(e)入条件队列notEmpty
count=0state=1
条件队列
AbstractQueuedSynchronizer
NodenextWait=null
抛异常IllegalMonitorStateExceptionwaitStatus=1(CANCELLED)
NodennextWaiter=Node(n+1)
Node1pre=nodeThread=T1next=Node2
unlinkCancelledWaiters
NodeThread=T2nextWaiter=nullwaitStatus=-2
否
总结
doSignal(first)发新号,通知条件队列当中节点到同步队列当中去排队
head
Node2pre=nodeThread=T2next=null
Sync
否加锁lock
firstWaiter
条件队列是不会被唤醒去竞争锁的,要唤醒去竞争锁的话需要转成CLH队列,才能去竞争锁
T1notFull进入CLH队列唤醒
T2take
addConditionWaiter
state=0head=null
t=lastWaiter
T2notEmpty进入CLH队列唤醒
!isOnSyncQueue(node)
Nodepre=nullThread=nullnext=node1
IN放入元素Items[0]=E
释放是否成功
t是否为空
notEmpty
OUT取出元素 Items[0]=E后,清空Items
ball
lastWait
head=nullstate=0waitStatus=-2(CONDITION)???
waitStatus=0
线程是否被打断
notFull
进入notFull条件队列阻塞
dequeue(e)出条件队列notEmpty
state=0head=nullexclusiveOwnerThread=null
first!=null
.......
LockSupport.unpark(node.thread)释放锁
自旋阻塞线程 :如果不在同步队列中则不断挂起LockSupport.park(this)
IllegalMonitorStateException
第二次容量满了进入阻塞
释放锁lock.unlock()
c=state-release(1-1)
count=1元素添加放入元素
Nodet=firstWaiterNode trail = null
notEmpty出队count--(1-1=0)取出元素E返回
是否有独占锁
t != null && t.waitStatus != -2
exclusiveThreadOwner=T2
Node1nextWaiter=nullwaitStatus=-2prev=Node
transferForSignal(first)
条件队列prev=nullnext=null
释放是否成功c==0
tail
N
是进入队列阻塞
将当前条件节点入CLH同步队列enq(node)
检查放入元素是否为空
ReetrantLock
interruptMode = 0
InterruptedException
firstWait
do nothing
notEmpty.signal()
将notFull入CLH队列唤醒
Node t=lastWaiter
Node1nextWaiter=Node(n-1)
Node1pre=nodeThread=T1next=node2
NodenextWaiter=node1waitStatus=-2
第一次顺利取出,唤醒T1放球
循环移动nextWaiter移除waitStatus!=-2的节点
自旋球的数量是否为0count==0
if (tryRelease(arg)) { Node h = head; if (h != null && h.waitStatus != 0) unparkSuccessor(h); return true; } return false;
Items[0]size=1E
判断容量是否已满
lastWaiter
将notEmpty入CLH队列唤醒
抛异常
Node2pre=node1Thread=T2next=null
Node first = firstWaiter(此时不为空)
count=1state=1
NodeThread=T1nextWaiter=nullwaitStatus=-2
Y
tryRelease是否成功
资源总数state=1
收藏
0 条评论
下一页