ReentrantLock
2023-01-04 21:29:02 0 举报
ReentrantLock
作者其他创作
大纲/内容
unpark唤醒线程
1、创建node节点
是
int savedState = fullyRelease(node);
//NonfairSyncnonfairTryAcquire(acquires);
有锁,判断是否是重入锁
lock.lock();
获取锁失败
int c = getState() - releases;setState(c);
final Thread current = Thread.currentThread();current == getExclusiveOwnerThread()
//NonfairSyncacquire(1);
重入锁,state累加
否,park当前线程
//wait逻辑Condition condition = lock.newCondition();condition.await();
//判断node是不是head的下一个节点,并且成功获取锁node.prev == head && tryAcquire(arg)
firstWaiter-->nextWaiter...-->lastWaiter
唤醒双向列表head.next节点
释放锁
获取锁
//AbstractQueuedSynchronizeraddWaiter(Node.EXCLUSIVE)
//当前线程赋值给AbstractOwnableSynchronizer.exclusiveOwnerThreadsetExclusiveOwnerThread(Thread.currentThread());
Node是双向列表
唤醒wait线程
doSignal(first);
getState()==0
把单向列表第一个node节点添加到双向列表中
for (;;)
parkAndCheckInterrupt(){LockSupport.park(this);}
sync.release(1);
单链表node入队
非重入锁,生成node节点
创建node节点
死循环获取锁
condition.signal();
双向链表
head <——>node... <——>tail
int nextc = c + acquires; setState(nextc);
NonfairSync.lock()
无锁,尝试cas获取锁
2、node入队尾,链表头head是一个没有属性的node, head = new Node()
enq(node)
tryRelease(arg)
判断是否有锁
//node节点设置成head节点setHead(node);cancelAcquire(node);
Node node = addConditionWaiter();
执行业务逻辑
尝试重新获取锁
加锁
unparkSuccessor(h);
阻塞自己
解锁
入队
lock.unlock();
ReentrantLock lock = new ReentrantLock();
LockSupport.park(this);
0 条评论
下一页