AQS
2020-09-30 14:28:15 0 举报
java AQS
作者其他创作
大纲/内容
内部类
enq()初始化队列,生成虚拟头节点,并把当前节点加入队尾
虚头节点:node = new Node();node中其余常量都为空
ConditionObject(条件对象)
......
fair:判断是否需要队列unfair:CAS
acquireQueued()
lock()
ReentrantLock
内部类:+ Sync+ NonfairSync+ FairSync常量:- sync
Sync
方法:- nonfairTryAcquire():非公平锁获取- tryRelease():释放锁- newCondition():新建条件对象- getOwner():当前锁持有的线程
当前线程被park
1.将当前节点设置为头节点并清空值;2.将prev.next置为null,辅助GC;
addWaiter()
CAS获取锁成功
把当前节点加入队尾
CAS将waitState改为-1
true
shouldParkAfterFailedAcquire()
队列是否初始化
...return false
结束
-1
判断队列是否为空head != tail
Node(等待队列节点类)
常量:- waitState:当前节点是否阻塞(park)- thread:当前节点的线程- prev:前继节点- next:后继节点
注:以下是fair锁获取过程
FairSync(公平锁)
方法:- lock():加锁- tryAcquire():尝试获取锁
else
生成node节点
判断当前节点的前节点prev的waitState
获取当前节点的prev节点
prev是否是头节点 && tryAcquire()
false
获取锁过程:CAS+自旋+CLH队列+Park
true获取锁成功
AbstractQueuedSynchronizer(抽象类)
内部类:+ Node+ ConditionObject常量:- state:是否获取到锁- head:等待队列中头节点- tail:等待队列中尾节点- thread:当前持有锁的线程
继承
NonfairSync(非公平锁)
0
return true
0 条评论
下一页
为你推荐
查看更多