ReentrantLock
2022-03-30 16:27:25 5 举报
初试ReentrantLock,仅供参考
作者其他创作
大纲/内容
acquireQueued
tryAcquire
shouldParkAfterFailedAcquire
Sync
false
getState()
true
unlock
prevNode == headNode
Lock
result
lock方法
prevnextthreadnextWaiter
占有锁线程
AbstractQueuedSynchronizer
NonfairSync
fair
AbstractQueuedSynchronizerrelease
AbstractOwnableSynchronizer
0
抛异常
从头节点(哨兵节点)开始查找下一个节点,如果下一个节点为null或包含的waitStatus>0,采用尾部反向遍历获取离头部最近、非空节点、waitStatus<=0的节点将其对对应线程唤醒LockSupport.unpark
false -> NonfairSynctrue -> FairSync默认false,非公平锁,效率高
headtailstate
getExclusiveOwnerThread获取当前占有锁线程
head = newNodenewNode.thread = nullnewNode.prev = nullprevNode.next = null
currentThread == getExclusiveOwnerThread
state
setExclusiveOwnerThread(null)
将newNode同前边waitStatus=-1的节点连接起来
state-1=0
addWaiter
自旋处理
LockSupport.park
公平锁、非公平锁区别:双向链表中是否有待处理的node且线程非当前线程
unparkSuccessor
newNode
hasQueuedPredecessors
true 获取锁当前线程正常执行
compareAndSetState 0 -> 1
state+=1
ReentrantLock
equals
parkAndCheckInterrupt
Node prevNode = newNode.predecessor()
Node
ReentrantLock:可重入独占锁,默认非公平非公平模式下当前线程会有2次获取独占锁的机会,如果获取到锁就避免了线程挂起等操作线程的阻塞和唤醒会浪费更多的资源双向链表
newNode.prev = tailNodecompareAndSetTail(tailNode -> newNode)tailNode.next = newNode
当前线程
currentThread
当新增节点的前置节点为头节点时那么他会再次尝试一次获取锁
ReentrantLocktryRelease
FairSync
自旋,将新节点接入双向链表
更新state(涉及线程重入锁)
0 条评论
下一页