作者:王文波玉龙_946 | 来源:互联网 | 2023-06-28 10:43
ReentrantLock中的公平锁以及非公平锁实现是继承AQS.所以在调用构造方法传入的值决定了是否为公平锁。其中的lock方法底层调用AQS的acquire方法。如下tryAc
ReentrantLock中的公平锁以及非公平锁实现是继承AQS.所以在调用构造方法传入的值决定了是否为公平锁。其中的lock方法底层调用AQS的acquire方法。如下
tryAcquire方法的实现有公平和非公平实现,可以看到实现类有ReentrantLock
非公平锁加锁流程NonfairSync方法
如果如果没抢到锁 如果没抢到锁,就执行后续流程acquireQueued(addWaiter(Node.EXCLUSIVE), arg),就执行后续流程acquireQueued(addWaiter(Node.EXCLUSIVE), arg)没抢到锁如果没抢到锁,就执行后续流程acquireQueued(addWaiter(Node.EXCLUSIVE), arg),先执行addWaiter
addWaiter这个就执行完成,会返回一个node对象。在执行aquireQueue方法。该方法为入队方法
shouldParkAfterFailedAcquire方法
该方法确保前驱结点的状态为SIGNAL,然后阻塞当前线程。这样做是因为在前驱节点释放锁后会唤醒后继节点。可以看下释放锁的源码,会用到该状态的判断
,就执行后续流程acquireQueued(addWaiter(Node.EXCLUSIVE), 如果没抢到锁,就执行后续流程acquireQueued(addWaiter(Node.EXCLUSIVE), arg)