ReentranLock
2020-10-09 15:35:34 25 举报
ReentranLock 加锁解锁过程
作者其他创作
大纲/内容
1.轮询拿锁 a.校验当前节点的上一个节点是否为头节点 b.尝试加锁tryacquire()
否
是
拿锁成功
调用解锁 unlock()
调用加锁lock()
尝试加锁 tryacquire()
加入队列 acquirequeued()
当前线程是否为拿锁线程
获取加锁许可 acquire()
unpark()
抛出异常
挂起线程 park()
拿锁成功1.修改当前头节点为当前节点2.原头节点的下级节点清空,用于GC回收3.返回true
加锁
锁状态等于0:1.判断是否需要排队,则需要返回false2.CAS修改锁状态,失败返回false3.设置当前拿锁线程为当前线程,返回true锁状态不等于0:1.判断当前拿锁线程是不是当前线程,不是返回false2. 设置锁状态为重入锁+1,返回true
封装当前线程为队列节点
解锁
0 条评论
下一页