1.ReentrantLock简介
理解了AQS,ReentrantLock理解起来其实就没有什么难度了。ReentrantLock,可重入锁。它可以等同于
synchronized的使用,但是ReentrantLock提供了比synchronized更强大、灵活的锁机制,可以减少死锁发
生的概率。
2.ReentrantLock继承关系
Lock中的方法: 主要提供了获取锁、尝试获取锁、释放锁、条件锁等几个方法。
3.源码分析
3.1 ReentrantLock内部类
ReentrantLock内部类有三个:Sync实现了AQS,NonfairSync 实现了Sync,用于获取非公平锁,FairSync 实现
了Sync用于获取公平锁。
abstract static class Sync extends AbstractQueuedSynchronizer
static final class NonfairSync extends Sync
static final class FairSync extends Sync
//ReentrantLock只有一个Sync属性
private final Sync sync;
//默认构造函数:非公平锁
public ReentrantLock() {
sync = new NonfairSync();
}
//根据fair判断初始化公平锁还是非公平锁
public ReentrantLock(boolean fair) {
sync = fair ? new FairSync() : new NonfairSync();
}
3.2 非公平锁的获取
平时使用ReentrantLock的方法:
ReentrantLock lock = new ReentrantLock();
try{
lock.lock();
}catch(Exception e){
.....
}finally{
lock.unlock();
}
先来看看lock()方法:
public void lock() {
//非公平锁的获取
sync.lock();
}
final void lock() {
//先CAS操作AQS的state成功,则表示获取锁
if (compareAndSetState<