ReentranctLock加锁流程
2021-12-06 10:30:29 0 举报
ReentranctLock加锁流程流程图详解
作者其他创作
大纲/内容
true
true/false
false
return 值
head
false获取到锁
true未获取到锁
非公平锁
开始
tail
return node
Thread.currentThread()waitStatus=0
node.prev = pred
队列有一个线程入队
protected final boolean tryAcquire(int acquires) { return nonfairTryAcquire(acquires);}
返回值取反
抛出异常
当前状态值 + 1(重入)
获取node的上一个节点 p
尝试获取锁!tryAcquire(1)
定义变量:boolean failed = true;boolean interrupted = false;
lock()
获取锁的状态
setHead(node); p.next = null;修改变量failed = false
自旋
判断条件tryAcquire(1)
t.next=node
判断队列head!=tail
next
公平锁
true需要初始化
参数传递
enq(final Node node)
判断队列是否初始化
结束
acquire(1)
判断持有线程是否是当前线程
如果状态小于0
Thread.currentThread().interrupt();
判断线程是否是当前持有线程
tail != null
LockSupport.park(this);线程休眠;被唤醒后从此处执行
thread=nullwaitStatus=0
nonfairTryAcquire(1)
CAS将状态值+1
如果p==head
parkAndCheckInterrupt()
CAS设置头部节点new Node()
判断条件parkAndCheckInterrupt()
getState()
thread=nullwaitStatus=-1
返回值
AQS队列入队前后对比
设置锁持有线程标识
判断获取失败后是否能安全休眠
fasle未初始化
CAS设置尾部节点
队列刚初始化并未有入队
hasQueuedPredecessors()
判断锁的状态c==0
判断条件!hasQueuedPredecessors()
判断s==null
return interrupted
修改变量interrupted = true;
node.prev = t
判断条件acquireQueued()
s=head.next
tail = head;
判断条件acquireQueued()
prev
设置新的状态值setState(nextc)
设置线程持有标识setExclusiveOwnerThread(Thread.currentThread())
compareAndSetTail
成功
判断锁是否是自由状态
获取锁的状态int c = getState()
创建当前线程的node
true为获取到锁
非公平锁和公平锁的区别就在tryAcquire()方法的实现
shouldParkAfterFailedAcquire
false直接入队
acquire( 1 )
判断s.thread!=当前线程
CAS设置尾部为当前node
true已初始化,是否有等待线程
addWaiter(Node.EXCLUSIVE)
tryAcquire(int acquires):boolean
判断线程休眠时是否被中断Thread.interrupted()
t == null
赋值 t = tail;
收藏
收藏
0 条评论
下一页