浅析JDK1.8 ReentrantLock源码。
写在开篇
ReentrantLock–重入锁,是实现Lock接口的一个同步组件。这篇文章建立在熟悉AQS源码的基础上,同时主要从两个方面来分析ReentrantLock:
重入性的实现原理
公平锁和非公平锁
类的继承关系
ReentrantLock实现了Lock和Serializable接口。
public class ReentrantLock implements Lock, java.io.Serializable {
成员变量
/**
- ReentrantLock通过sync(AQS的子类)来实现锁
*/
private final Sync sync;
这里再说明一下ReentrantLock语境下,AQS的成员变量:
/**
- state用来表示该锁被线程重入的次数。
- 0表示该锁不被任何线程持有
- 1表示线程恰好持有该锁1次(未重入)
- 大于1则表示锁被线程重入state次
*/
private volatile int state;
/**
- 标识锁被哪个线程持有
*/
private transient Thread exclusiveOwnerThread;
静态内部类
Sync也是一个抽象类,因为锁有非公平和公平的区别。
abstract static class Sync extends AbstractQueuedSynchronizer {
private static final long serialVersionUID = -5179523762034025860L;
/** * 非公平和公平锁的lock()方法有不同的实现。 */ abstract void lock(); /** * 非公平的独占锁获取同步状态 */ final boolean nonfairTryAcquire(int acquires) { final Thread current = Thread.currentThread(); int c = getState(); if (c == 0) { if (compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } else if (current == getExclusiveOwnerThread()) { int nextc = c + acquires; if (nextc < 0) // overflow throw new Error("Maximum lock count exceeded"); setState(nextc); return true; } return false; } /** * 尝试释放锁 */ protected final boolean tryRelease(int releases) { int c = getState() - releases; if (Thread.currentThread() != getExclusiveOwnerThread()) throw new IllegalMonitorStateException(); boolean free = false; if (c == 0) { free = true; setExclusiveOwnerThread(null); } setState(c); return free; }
}
构造方法
/**
* 默认构造非公平锁
*/
public ReentrantLock() {
sync = new NonfairSync();
}
/**
* @param fair true构造公平锁,false构造非公平锁
*/
public ReentrantLock(boolean fair) {
sync = fair ? new FairSync() : new NonfairSync();
}
非公平锁
非公平模式加锁流程
加锁流程从lock.lock()开始
public void lock() {
sync.lock();
}
来源:https://www.cnblogs.com/kyrie17/p/12231156.html