AQS
2021-12-10 09:43:20 8 举报
从ReentrantLock加锁释放锁的视角去解读AQS源码
作者其他创作
大纲/内容
prev
head
若state=0,Owner设置为null
new Node()
Owner=T-1
Sync
AbstractQueuedSynchronizer
ReentrantLock
Thread-1
Thread-2
state = 1
查看Owner是否是当前线程----否
Owner=null
如果CAS成功,就设置Owner为当前线程
①Node t = tail;node.prev = t;将节点prev指向之前的tail
state = 0
NofairSync
唤醒队头的Thread-2
next
③t.next = node;将之前的tail的next指向新node构建双向链表
获取锁失败,进入等待队列
CAS
CAS失败
T-2
同步队列
Owner=T-2
FairSync
tail
假设已有线程获取了锁,现有新的线程想要获取锁,失败,尝试进入队列。调用enq方法,若队列为空,则new Node,将tail和head都指向新的node
thread = nullwaitStatus = -1
获取锁成功,Owner=T-2
同理,当Thread-2进入队列后如下
state减1
0 条评论
下一页