ReentrantLock的UNFAIR的LOCK过程
2021-11-15 20:49:28 0 举报
ReentrantLock的UNFAIR的LOCK过程
作者其他创作
大纲/内容
是
判断尾节点是否为空
把当前线程节点设置为头节点,头节点的next置为空,
设置exclusiveOwnerThread为当前线程
当前线程就是获取锁的线程(重入)
state++
锁是否已被释放
新建一个Node节点,把线程放到节点里
是否抢占成功
否
自旋
return false
返回true
成功
Start
selfInterrupt()自我中断
调用enq()
nonfairTryAcquire(1);
ReentrantLock非公平锁实现
compareAndSetStateCAS抢占锁
第一次调用
进行CAS=>compareAndSetHead(设置new Node节点为head,tail也赋值为new Node)
shouldParkAfterFailedAcquire 因为是Node.SIGNAL直接返回true && parkAndCheckInterrupt()=>LockSupport.park(this);当前线程挂起 未抢占到锁的就都挂起
获取当前线程以及锁状态
!tryAcquire(1)
返回false
失败
return true
shouldParkAfterFailedAcquire 在compareAndSetWaitStatus函数把head节点waitStatus改成Node.SIGNAL
acquireQueued(当前线程节点,1)
第二次调用
判断当前节点的前一个节点是head && 并且抢占锁成功
End
acquire(1);
addWaiter(Node.EXCLUSIVE)
满足acquire的条件判断
0 条评论
回复 删除
下一页