JUC-aqs加锁流程
2018-02-23 17:56:52 0 举报
登录查看完整内容
JUC
作者其他创作
大纲/内容
null
3
head头节点pre=null;next=0x01;thread=thread-0;waitstate=-1
将新加入的Node设置到Condion队列队尾
将新加入的Node设置到AQS队尾
N
获取Condition队列的firstWaiter(头结点)
volient int state
线程1抢到锁
返回当前线程Node
返回加入的Node
重试抢锁失败,添加线程到AQS队列
Y
释放锁,setState(0),置空当前OwnThread
该线程state值为3,表示重入了2次
是否在AQS队列
将Node.pre的waitStatus设置为SIGNAL(-1)
head头节点pre=null;next=0x01;thread=null;waitstate=0
Thread-2
当前线程执行
持有锁的线程
流程与上面一致
tryAcquire(1)
激活first线程
是否挂起(返回值为true)
addConditionWaiter()添加当前线程到Condition队列
setState(state+1)
FairSync略
fair
fullyRelease(node)
实际执行nonfairTryAcquire()
await()
将firstWaiter的status设为0
acquire(1)
firstWaiter参与AQS的锁竞争
Thread-1
tail尾节点pre=0x00;next=null;thread=thread-1;waitstate=-1
tail尾节点pre=0x00;next=null;thread=thread-3;waitstate=0
设置Node为头结点
targeMethodlock.lock()
将firstWaiter放入AQS队列
持有锁线程设置为当前线程
挂起线程
shouldParkAfterFailedAcquire()
signal()
NS.lock()
返回false
Node.pre是否是头结点
tryAcquire(1))
Thread exclusiveOwnerThread
1
返回true
挂起当前线程
第一次为线程1,若重试阶段线程2抢锁成功则设为线程2
Thread-3
2
流程与上面一致,AQS的头结点尝试获取锁,并将state值设为10,因为执行的是Node线程
此例子为ReentrantLock加锁流程:AQS:AbstractQueuedSynchronizerNS:NonfairSync
收藏
0 条评论
回复 删除
下一页