ReentrantLock公平锁
2021-07-22 17:59:39 8 举报
ReentrantLock公平锁
作者其他创作
大纲/内容
NodeA
CAS state + 1
N
加锁失败
每次重入 +1每次退出 - 1
setExclusiveOwnerThread
LockSupport.unpark(currentNode.next.thread)
SIGNAL
其他
IllegalMonitorStateException
head = tail = null
Y
存在
NodeB
head
释放许可,目的是唤醒后续自旋线程去获取锁
exclusiveOwnerThread
公平锁加锁流程
前置节点为head
tail
公平锁解锁流程
Node双向链表
lock()
CANCELLED=1
正数,表示取消状态
SIGNAL=-1
后继线程需要解锁
CONDITION=-2
线程正在等待条件
PROPAGATE=-3
指示下一个acquireShared应该无条件传播
更新state = c
LockSupport.park(this)
tryAcquire流程
不是当前线程
state + 1
初始状态
0
null
当前线程
AQS = Node + state
head == null&&head.next.thread = currentThread
head指向当前Node(prev、next置为null)
exclusiveOwnerThread = null 重入线程完全退出
前置节点waitStatus
= 0
return false
锁获取成功
prev
next
thread
nextWaiter
waitStatus
CAS 更新前置节点waitStatue=SIGNAL
CAS 添加至等待队列末尾
c = state - 1
currentNode.next
c == 0
加锁成功
unlock()
删除无效的前置节点
Node数据结构
false
return true
公平之处在于:每次都判断当前线程是否排在等待队列的第一位
阻塞自选获取锁
true
state
收藏
收藏
0 条评论
下一页