获取锁
2021-12-03 16:12:16 0 举报
获取锁
作者其他创作
大纲/内容
不是中断唤醒
设置Sync对象持有的锁的线程为null
AbstractQueuedSynchronizer
LockSupport.unpark(s.thread)
尝试获取锁成功
非公平锁
队列是否为空
判断同步等待队列中是否有等待的线程hasQueuedPredecessors()
小于0
公平锁
判断同步是否为空
否
队列中有等待的线程
tryAcquire(int acquires)
有
同步队列的头节点的waitStatus是否为0
获取到锁
非空
Sync
if (ws < 0)
判断为否,重复执行for循环
队列初始化compareAndSetHead(new Node())tail = head
头节点的下一节点是否为空,或者waitStatus>0
1.尝试获取锁
ReentrantLock
是
lock
state!=0
方法
公平锁:如果Sync对象没有被线程持有且当前线程没有等待的线程,则直接获取锁;如果持有Sync对象的锁的线程为当前线程,则修改Sync对象的state属性,并获取锁。非公平锁:如果Sync对象没有被线程持有,则直接获取锁;如果持有Sync对象的锁的线程为当前线程,则修改Sync对象的state属性,并获取锁。
获取头节点的waitStatusint ws = node.waitStatus;
添加失败重复for循环
没有等待的线程
tryRelease(arg)
int nextc = c + acquires;setState(nextc);
是否为公平锁
入队enq(node)
state=0,Sync对象没被线程持有
has
抛出异常
不为0
继承
FairSync
parkAndCheckInterrupt()阻塞线程
设置state为c
setExclusiveOwnerThread(current)将Sync对象的exclusiveOwnerThread设置为当前线程
添加node至队尾
cancelAcquire(node)取消竞争锁
没有
unlock()
判断当前线程是否是持有锁的线程current == getExclusiveOwnerThread()
被唤醒
添加成功
return node
NonfairSync
尝试获取锁失败
addWaiter(Node.EXCLUSIVE)
获取到头节点的下一节点
当前线程是否是持有锁的线程
空
unparkSuccessor(h)
从同步队列的尾部开始找到非头节点非空节点waitStatus <= 0的节点
判断线程是否中断
compareAndSetState失败
release(1)
释放锁成功
3.在同步队列中尝试获取锁
2.添加当前线程到同步等待队列中(独占模式)
类
当前节点的前一个节点是否为头节点
重复for循环
c==0
acquire(int arg)
tryAcquire(arg)
int c = getState() - releases;
获取锁成功
Sync对象是否被线程持有state==0
同步等待队列中是否有线程tail != null
0 条评论
下一页