请问老师,对于ReenTrantLock中的lock方法,看到AQS中的acquire()方法有点懵

来源:9-4 synchronized和ReentrantLock的区别

带不走的眼泪

2019-03-22

图片描述
在多线程的情况下,是怎么去锁住的呢,if中三个方法看了注释也有点懵?老师能不能帮助我理一下。

写回答

1回答

翔仔

2019-03-23

同学好,想要了解如何被锁住,建议先学习一下AQS以及我们如何利用AQS来做实现。

方法里面的tryAcquire我们点进去发现是待实现的protected方法,它其实是调用acquire方法的Syn类继承并实现了,主要是去尝试获取独占锁,如果成功则表示已经获取到锁,则线程可以继续执行后面的操作跳过if及其对应的逻辑;

如果tryAcquire获取锁失败,则进入到acquireQueued里面,首先调用addWaiter将当前线程以节点的形式尝试添加到队列里(咱们AQS里最重要的两个东西,一个是状态,一个是队列,当然了还包括修改状态以及获取释放锁的方法)。添加到队列里之后就会调用acquireQueued去尝试获取锁(同学可以看看里面的逻辑,里面会用一个无限for循环去重试),一旦获取成功则退出,让线程继续接下来的逻辑;获取不到的话则重试,并且在满足一些条件后可能会中断或者退出线程。

过程确实是比较复杂的,但是同学理清楚之后,还是能看得懂的,这里长篇大论也没办法说清楚,大致能帮同学理清到这里,同学可以按照思路继续分析,加油。

1
0

剑指Java面试-Offer直通车 百度资深面试官授课

招聘季即将到来,让百度资深面试官来为你的高薪Offer保驾护航

8441 学习 · 1872 问题

查看课程