ReentrantLock之公平与非公平模式
ReentrantLock是java重要的锁之一,这里只讨论其公平和非公平模式。
1. 初始化
ReentrantLock有两个构造函数,通过构造函数我们可以看到
1. 默认使用的是非公平模式。
2. 通过有参的构造函数可以指定使用公平还是非公平模式。
public ReentrantLock() {
sync = new NonfairSync();
}
public ReentrantLock(boolean fair) {
sync = fair ? new FairSync() : new NonfairSync();
}
2. 公平与非公平实现
ReentrantLock是通过一个静态内部内Sync实现的,Sync继承自AbstractQueuedSynchronizer,并实现了其抽象方法。AbstractQueuedSynchronizer是java的一个抽象的同步器框架,大多数的java同步工具类都是由其实现。而NonfairSync和FairSync通过继承Sync实现锁的功能。接下来看下是如何实现公平与非公平的。
2.1 NonfairSync的非公平性实现
NonfairSync的实现代码如下:
static final class NonfairSync extends Sync {
private static final long serialVersionUID = 7316153563782823691L;
/**
* Performs lock. Try immediate barge, backing up to normal
* acquire on failure.
*/
//加锁方法
final void lock() {
//cas,如果当前state=0则将state替换为1
if (compareAndSetState(0, 1))
//替换成功,则表示获得锁,同时将当exclusiveOwnerThread设置为当前线程,之后会通过该值是否是当前线程来确定是否重入
setExclusiveOwnerThread(Thread.currentThread());
else
//替换失败,表示获取锁失败,此时通过acquire(1)进一步获取锁
acquire(1);
}
protected final boolean tryAcquire(int acquires) {
return nonfairTryAcquire(acquires);
}
}
如上图代码所示,当使用非公平模式时,ReentrantLock.loc