ReentrantLock是JAVA中除synchronized外,另一种简便的管理资源锁的工具类,它还提供了Condition对象的创建,供调用者添加不同的条件队列,实现更灵活多样化的等待机制,ReentrantLock是基于AQS实现的,所以在阅读本文前需要掌握AQSJAVA并发(二)AQS,否则会看起来比较吃力。
文章目录
ReentrantLock
ReentrantLock有两个构造器,可选择公平锁FairSync
和非公平锁NonFairSync
。
private final Sync sync;
public ReentrantLock() {
sync = new NonfairSync();
}
public ReentrantLock(boolean fair) {
sync = fair ? new FairSync() : new NonfairSync();
}
公平锁与非公平锁
ReentrantLock的加锁lock()
分为公平锁与非公平锁。
公平锁FairSync
和非公平锁NonFairSync
都继承至Sync
,而Sync
继承至AQS,因此,ReentrantLock是基于AQS实现的。公平锁与非公平锁的区别是lock的机制不同,而锁的释放是一致的,下方代码块截取了Sync
类的加锁相关的方法。Sync
提供了lock的抽象方法、非公平锁的tryAcquire方法。
abstract static class Sync extends AbstractQueuedSynchronizer {
private static final long serialVersionUID = -5179523762034025860L;
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;
}
}
NonfairSync&FairSync
公平锁与非公平锁的代码块如下。