ReentrantReadWriteLock中的内部类Sync很重要,因为主要的实现逻辑就在它里面,看一下它比较重要的成员
abstract static class Sync extends AbstractQueuedSynchronizer {
...省略
//共享资源数的位数
static final int SHARED_SHIFT = 16;
//获取共享资源的单位数
static final int SHARED_UNIT = (1 << SHARED_SHIFT);
static final int MAX_COUNT = (1 << SHARED_SHIFT) - 1;
static final int EXCLUSIVE_MASK = (1 << SHARED_SHIFT) - 1;
//上面想表达的是,sync的state值高16位是保存共享资源数,低16位是保存排它资源数
//获取共享资源数,就是c的高16位数
static int sharedCount(int c) { return c >>> SHARED_SHIFT; }
//获取排它资源数,其实就是c的低16位
static int exclusiveCount(int c) { return c & EXCLUSIVE_MASK; }
//一个内部类,用于记录每个线程持有的共享资源数
static final class HoldCounter {
int count = 0;
//每个线程的唯一ID
final long tid = getThreadId(Thread.currentThread());
}
private transient HoldCounter cachedHoldCounter;
//一个内部类,保存每个线程的HoldCounter对象(需要了解ThreadLocal相关知识)
static final class ThreadLocalHoldCounter
extends ThreadLocal<HoldCounter> {
public HoldCounter initialValue() {
return new HoldCounter();
}
}
//这个变量可以获取每个线程的HoldCounter对象
private transient ThreadLocalHoldCounter readHolds;
}
看看构造方法
Sync() {
readHolds = new ThreadLocalHoldCounter();
setState(getState()); // ensures visibility of readHolds
}
Sync有两个子类:FairSync、NonfairSync,所以ReentrantReadWriteLock支持公平、非公平锁。
下篇文章分析ReentrantReadWriteLock的writeLock的公平、非公平锁实现