ReentrantLock流程图
2021-12-09 15:54:57 4 举报
ReentrantLock流程图
作者其他创作
大纲/内容
前置节点是否为头节点
unlock解锁
parkAndCheckInterrupt
release
公平
获取失败
shouldParkAfterFailedAcquire
没有
没有获取到锁
通过 cas 修改 state,并把当前线程设置到exclusiveOwnerThread
tryAcquire尝试获取锁成功后设置头结点
公平锁比非公平锁多判断了hasQueuedPredecessorsstate=0 队列不一定为空
直接cas尝试设置 state
doAcquireInterruptibly
state 是否为 0,即是否有线程在等待
addWaiter添加节点到队尾
hasQueuedPredecessors判断是否有队列在等待
等于 0
如果为当前线程则 state+acquires否则获取锁失败
acquireInterruptibly
简单说就是把前置节点waitStatus设置为SIGNAL(-1)
否
不等于 0
设exclusiveOwnerThread为 null如果 state 为 0 则返回 true
非公平
设置成功
acquireQueued类似只是加了超时处理
是
减完后 state 是否为 0
addWaiter
tryAcquire同 lock 一样
lockInterruptibly可中断
尝试把waitStatus改为 0
lock
被唤醒则继续尝试获取锁,获取失败继续 park
addWaiter创建一个 node 并通过 cas添加到同步队列队尾
LockSupport#park阻塞,等待 unpark
tryRelease
doAcquireNanos
找到下一个可以唤醒的节点
如果前置节点是头结点则尝试获取锁tryAcquire
同 lock 区别在于如果是中断唤醒则直接抛异常
unparkSuccessor
如果剩余超时时间大于 1 毫秒则阻塞线程LockSupport.parkNanos
tryAcquire尝试获取锁
LockSupport.unpark
shouldParkAfterFailedAcquire同 lock 一致
acquireQueued获取锁核心逻辑
如果有中断则返回 true
如果超时则设置waitStatus为CANCELLED(1)cancelAcquire
0 条评论
下一页