ReentrantLock加锁
2020-07-25 11:42:56 0 举报
AQS源码加锁流程
作者其他创作
大纲/内容
fairSync
判断当前节点的前一节点是否为head
true
acquire
返回node
false
拿到当前锁,返回true,执行业务代码
c = 0
c!=0
ws = 0
传入当前线程创建一个新节点node
nonfairSync
acquiredQueued
判断c的值
parkAndCheckInterrupt()
addWaiter()
LockSupport.park(this)当前线程阻塞在这个地方
判断前一节点的ws的值
setState(nextc)更新state值
fairSync.lock()
h!=t(队列为空)
nextc = c + acquires锁状态值加一,表示重入
判断尾结点是否为null
设值当前线程为持有锁的线程
拿到锁执行业务代码
Syn内部类(AQS)
判断当前线程是否持有锁
ws = -1
acquire(1)
tryAcquie(方法)不会去看队列中是否有线程在排队
fairSync.lock()
向上返回true
for(;;)再次执行shouldParkAfterFailed()会尝试获取锁
compareAndSetHead(new Node())头结点指向空节点
和公平锁区别2
tryAcquire(1)
hasQuenedPredecessors()判断队列是否为空
和公平锁区别1
enq(node)初始化队列
ReenTrantLock
和公平锁执行流程相同
h=t(队列不为空)
判断尾结点是否为nulll
for(; ;)中当前节点指向前面的空节点,空节点指向node节点
拿不到锁
tryAcquire()尝试去获取锁
0 条评论
回复 删除
下一页