ReentrantLock根据源码分析公平锁加锁流程
2020-02-06 13:54:08 0 举报
ReentrantLock根据源码分析公平锁加锁流程
作者其他创作
大纲/内容
tryAcquire()
ws==-1
sync.lock();
执行业务逻辑
判断要不要排队
h != t && ((s = h.next) == null || s.thread != Thread.currentThread());
node.prev==head
根据当前线程实列化一个node
队列有没有初始化
false
tryAcquire返回false
h=t=headh!=t返回false
未被持有
tryAcquire返回true
自旋初始化队列并将node入队
被持有
acquireQueued
parkAndCheckInterrupt()
修改ws的状态:ws=-1,并返回false
自旋
t1持有锁,t2入队之后(aqs队列中有两个元素)通过自旋获取锁,然后将head指向自己,此时aqs中只有一个元素
执行LockSupport.park(this)方法,阻塞线程
AQS中有2个以上元素head\\t2\\t3
true
addWaiter入队
被初始化
acquire(1)
判断锁状态
h=t=nullh!=t返回false
线程t
reentrantLock.unlock()
enq(node)
CAS加锁
AQS中有2个元素t2和head
AQS中有1个元素head
reentrantLock.lock()
h!=t返回true((s = h.next) == null || s.thread != Thread.currentThread())返回true
h!=t返回true((s = h.next) == null || s.thread != Thread.currentThread())返回false
入队
0 条评论
下一页