前言
回顾前面:
多线程三分钟就可以入个门了!
Thread源码剖析
多线程基础必要知识点!看了学习多线程事半功倍
Java锁机制了解一下
AQS简简单单过一遍
上一篇已经将Lock锁的基础AQS简单地过了一遍了,因此本篇主要是讲解Lock锁主要的两个子类:
- ReentrantLock
- ReentrantReadWriteLock
那么接下来我们就开始吧~
一、ReentrantLock锁
首先我们来看看ReentrantLock锁的顶部注释,来看看他的相关特性呗:
来总结一下要点吧:
- 比synchronized更有伸缩性(灵活)
- 支持公平锁(是相对公平的)
- 使用时最标准用法是在try之前调用lock方法,在finally代码块释放锁
class X { private final ReentrantLock lock = new ReentrantLock(); // ... public void m() { lock.lock(); // block until condition holds try { // ... method body } finally { lock.unlock() } } }
1.1内部类
首先我们可以看到有三个内部类:
这些内部类都是AQS的子类,这就印证了我们之前所说的:AQS是ReentrantLock的基础,AQS是构建锁、同步器的框架
- 可以很清晰的看到,我们的ReentrantLock锁是支持公平锁和非公平锁的~
1.2构造方法
1.3非公平lock方法
尝试获取锁,获取失败的话就调用AQS的acquire(1)
方法
acquire(1)
方法我们在AQS时简单看过,其中tryAcquire()
是子类来实现的
我们去看看tryAcquire()
:
1.4公平lock方法
公平的lock方法其实就多了一个状态条件:
这个方法主要是判断当前线程是否位于CLH同步队列中的第一个。如果是则返回flase,否则返回true。
1.5unlock方法
unlock方法也是在AQS中定义的:
去看看tryRelease(arg)
是怎么实现的: