AQS框架—ReentrantLock
2022-08-07 17:43:52 0 举报
基于AQS框架的ReentrantLock同步器访问共享资源详细源码流程图
作者其他创作
大纲/内容
return true
获取共享资源成功加锁成功
循环出口也是方法出口
node为head节点,它的下一个节点就是线程节点Node s = node.next;
interrupted == true
false加锁失败
true
唤醒头节点线程unparkSuccessor(h);
nextWatier=null
唤醒队列中的线程LockSupport.unpark(s.thread);
设置状态值 setState(c);
current==ExclusiveOwnerThread
状态器State值减一int c = getState() - releases;
node
设置AQS中exclusiveOwnerThread属性为当前线程 setExclusiveOwnerThread(Thread.currentThread());
acquire(1);
lock.unlock();
shouldParkAfterFailedAcquire
for( ; ; )
nonfairTryAcquire
拿到clh队列中的头节点 Node h = head;
head
解锁
设置成功,设置头节点为当前节点,移除头节点(出队)setHead(node);p.next = null;
拿到当前节点的上一个节点 final Node p = node.predecessor();
tail
ReentrantLock lock = new ReentrantLock();默认非公平锁实现
next
false
第一个线程加锁成功
nonfair.lock
再次加锁失败
设置当前线程setExclusiveOwnerThread(Thread.currentThread());
c==0
此时clh队列中的ws = -1int ws = node.waitStatus;
当前线程是否存在中断标志return Thread.interrupted();
尝试加锁!tryAcquire(arg)
return interrupted
阻塞当前线程parkAndCheckInterrupt()
设置waitStatus =Node.SIGNAL( -1)
唤醒线程
thread=null
第一个线程访问共享资源
尝试释放资源tryRelease(arg)
thread=currentThread
free =true设置AQS中的当前线程为nullsetExclusiveOwnerThread(null);
prev
ture
获取状态值 int c = getState();
state加1,可重入锁实现 int nextc = c + acquires;setState(nextc);
return false
return free
锁资源释放成功return true;结束
给线程从新打上中断标志,表示当前线程可中断selfInterrupt();
独占模式添加当前线程到CLH队列addWaiter(Node.EXCLUSIVE)
lock.lock();
sync.release(1);
第一个线程state设置成功
CLH 同步等待队列
判断是否是头节点p == head
ws == Node.SIGNAL
再次尝试加锁tryAcquire(arg)
执行业务逻辑代码
阻塞线程被唤醒后
资源释放成功true
第二个线程访问共享资源
0 条评论
回复 删除
下一页