多线程高并发
2021-04-17 23:33:00 5 举报
ReentrantLock源码解析
作者其他创作
大纲/内容
NonFairSync
ReentrantLock
pre
类
方法
parkAndCheckInterrupt()
T
getState() == 0
waitStatus
tryRelease(arg)
next
node.predecessor() == head && tryAcquire(arg)
FairSync
new FairSync()
tryAcquire(args)
sync.release(1);
lock.lock()
thread
addWaiter(),在这里会将CLH初始化,并且创建新的线程Node加入tail,进行入队操作
setHead(node); p.next = null; // help GC failed = false; return interrupted;
setState(nextc)
Node
new ReentrantLock(true)
null
初始化Node的waitStatus=-1
addWaiter(Node.EXCLUSIVE)
再次尝试获取锁
current == getExclusiveOwnerThread()
CLH队列
LockSupport.park(this);线程阻塞
F
setExclusiveOwnerThread(current);
selfInterrupt()允许中断
hasQueuedPredecessors()判断当前节点前面是否有线程排队;没有的话,尝试改变state,获得锁
Syn
将队列前面的waitStatus重新设置为0
unparkSuccessor(h)
acquire(1)
0 条评论
下一页