ReentrantLock源码解析
2021-11-05 15:30:34 0 举报
ReentrantLock源码解析
作者其他创作
大纲/内容
cas将tail设置为node
设置成功
获取state 判断state是否为0则没有线程占有锁
cas抢占锁
调用nonfairTryAcquire
tryRelease(1)
判断当前节点的waitState是否为SIGNAL(0)如果是则自己调用park进入阻塞
有排队的队列
抢占失败
返回true等于当前线程的所有lock都被unlock了
是
将state+1返回true
将新的node加到tail后面node.prev = pred;
获取返回node的前节点
获取当前持有锁的线程 判断是否为当前线程(可重入锁)
addWaiter流程
NonfairSync-非公平锁
判断是否超时超时返回false
release(1)
将原tail的下一个节点指向新的node
未超时
false
尝试抢占锁成功返回true 不成功调用doAcquireNanos
addWaiter(Node.EXCLUSIV)Node.EXCLUSIV=null
获取state并减1
结束
否
加锁成功
返回false
没有排队的队列
tryAcquire(arg)如果等于head则尝试抢占一次锁
如果state=0 则将AOS中的线程设为null 并讲state设置回AQS
判断前面是否有排队的节点
调用addWaiter创建当前线程Node
加锁失败
抢占成功
获取当前head如果head不等于null或者waitStatus为0说明队列中有节点在阻塞 调用unpark结束此线程阻塞 返回true
主要是doAcquireInterruptibly其他方法与lock无差都是aqs的模板方法
线程被唤醒重新进入循环直到获取锁
设置失败
将head设置为当前node将前节点的next=null帮助GC回收
判断他的前节点是否等于head节点如果等于说明前面没有排队线程 可以抢占锁
ReentrantLockunlock
ReentrantLocktryLock(阻塞时间)
加锁成功/setExclusiveOwnerThread将当前线程设置AOS表示当前线程站有锁
判断tail != null
ReentrantLocklock
true
判断node前节点是否=head如果=说明前面无队列等待可以抢占锁抢占成功 这是head为当前node将p.next = null帮助gc回收返回 true
返回false等于此线程还有lock未解锁
ReentrantLocktryLock
FairSync-公平锁
返回node
将当前线程封装为一个node
直接调用nonfairTryAcquire方法抢占锁 抢到返回true 未抢到返回false
enq(node)队列的初始化,新建一个空node。然后不断尝试自选,直到成功的把node加入到队列尾部
ReentrantLocklockInterruptibly
收藏
收藏
0 条评论
下一页