ReentrantLock 原理
2022-04-23 20:25:35 0 举报
ReentrantLock 加锁 / 解锁流程
作者其他创作
大纲/内容
LockSupport.park
head
CurrentNode
为什么需要双向链表?
compareAndSetTail
Node
ws < 0
unlock
唤醒头节点: unparkSuccessor
acquireQueued:排队
volatile stete = 0 exclusiveOwnerThread:拥有该锁线程持有者
parkAndCheckInterrupt
waitStatus
YES
setState = 0
node == tail
h != t && ((s = h.next) == null || s.thread != Thread.currentThread())
state == 0
NO
pred == head
cancelAcquire
LockSupport.unpark
pre
3
ReentrantLock 原理
ReentrantLock
2
tail
ws > 0
addWaiter:入队
head != null && h.ws != 0
setExclusiveOwnerThread(null)
1
ReentrantLock 方法
skip cancelled pre node
node.next = node
tryRelease:释放锁
FairSync
signal
获取锁的线程是否是自己
中间节点
shouldParkAfterFailedAcquireskip cancelled node
state + 1
null
tail pre node!= cancelled
lock
cancelled
next
acquire
NonfairSync
tryRelease
release(1)
是否需要排队hasQueuedPredecessors
AQS方法
node pre == headtryAcquire 死心了
compareAndSetState失败
tryAcquire
enq(node)
DLH 队列 FIFO
0 条评论
下一页