欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ReentrantLock非公平锁源码解读

程序员文章站 2022-04-10 08:35:49
ReentrantLock中的公平锁以及非公平锁实现是继承AQS.所以在调用构造方法传入的值决定了是否为公平锁。其中的lock方法底层调用AQS的acquire方法。如下tryAcquire方法的实现有公平和非公平实现,可以看到实现类有ReentrantLock非公平锁加锁流程NonfairSync方法如果如果没抢到锁 如果没抢到锁,就执行后续流程acquireQueued(addWaiter(Node.EXCLUSIVE), arg),就执行后续流程acquireQue......

ReentrantLock中的公平锁以及非公平锁实现是继承AQS.所以在调用构造方法传入的值决定了是否为公平锁。其中的lock方法底层调用AQS的acquire方法。如下

ReentrantLock非公平锁源码解读

tryAcquire方法的实现有公平和非公平实现,可以看到实现类有ReentrantLock   

ReentrantLock非公平锁源码解读

非公平锁加锁流程NonfairSync方法

ReentrantLock非公平锁源码解读

ReentrantLock非公平锁源码解读

如果如果没抢到锁  如果没抢到锁,就执行后续流程acquireQueued(addWaiter(Node.EXCLUSIVE), arg),就执行后续流程acquireQueued(addWaiter(Node.EXCLUSIVE), arg)没抢到锁如果没抢到锁,就执行后续流程acquireQueued(addWaiter(Node.EXCLUSIVE), arg),先执行addWaiter

ReentrantLock非公平锁源码解读

ReentrantLock非公平锁源码解读

addWaiter这个就执行完成,会返回一个node对象。在执行aquireQueue方法。该方法为入队方法

ReentrantLock非公平锁源码解读

shouldParkAfterFailedAcquire方法

ReentrantLock非公平锁源码解读

该方法确保前驱结点的状态为SIGNAL,然后阻塞当前线程。这样做是因为在前驱节点释放锁后会唤醒后继节点。可以看下释放锁的源码,会用到该状态的判断

ReentrantLock非公平锁源码解读

ReentrantLock非公平锁源码解读

 

,就执行后续流程acquireQueued(addWaiter(Node.EXCLUSIVE), 如果没抢到锁,就执行后续流程acquireQueued(addWaiter(Node.EXCLUSIVE), arg)

本文地址:https://blog.csdn.net/weixin_42740540/article/details/109577063

相关标签: 源码 java lock