AQS-ReentrantLock详图
2020-09-08 10:02:17 0 举报
AQS-ReentrantLock详图
作者其他创作
大纲/内容
真
只可以用一次,第一次返回true,两次或多次为false
是
当前线程是否被中断
判断tail尾节点是否为空
unparkSuccessor
p.waitStatus==Node.SIGNAL
tryRelease(arg)
true
CAS设置节点
加锁未成功
当前节点已经是头节点,再次尝试拿锁
CAS原子算法
acquire(1)
判断tail前驱指针是否为空
CAS将节点Status修改为SINGANL状态
Thread.interrupted()
Lock过程
否
LockSupport.park(this)
arg=1
真or假
进入死循环
Thread.currentThread().interrupt()
sate==0
unlock()
CAS入队
boolean真假
ReentrantLock rl = new ReentrantLock(boolean);
加锁失败入队成功
lock
node.prev = pred;
判断加锁线程是否为当前线程(锁重入)
FairSync
判断waitStatus是否小于0
默认非公平
参数给予
setExclusiveOwnerThread
将当前节点的前驱指针指向尾节点
unLock过程
current == getExclusiveOwnerThread()
给予当前线程中断
final Node p = node.predecessor();
CAS将节点状态修改为0
设置Thread属性为当前线程
addWaiter(Node.EXCLUSIVE)
尾节点的后置指针执行当前节点
selfInterrupt()
开始加锁
线程阻塞,开始等待
判断
p.waitStatus>0
重要等级由低到高
do { node.prev = pred = pred.prev;} while (pred.waitStatus > 0); pred.next = node;
NonfairSync
acquires=1
给当前线程创建节点
头节点不等于尾巴节点,且当前thread属性不为当前线程.
cancelAcquire
sync.release(1)
LockSupport.unpark(s.thread);
!hasQueuedPredecessors
Node节点包含:1.prev前驱指针2.next后置指针3.head头节点4.tail尾节点thread标记当前线程state状态:CANCELLED =1;SIGNAL = -1;CONDITION = -2;PROPAGATE = -3;
P为最新头节点node为当前节点
tryAcquire(1)
parkAndCheckInterrupt()
尝试去拿当前节点的前置节点
过程代码
为保证可以成功入队
唯有异常且failed为真时才能进入
加锁成功
pred.next = node;
0 条评论
下一页