ReentrantReadWriteLock 读写锁
构造函数
与ReentrantLock相类似, 其自定义同步器Sync分为公平锁FairSync与非公平锁NonfairSync的两种.
默认为NonfairSync
public ReentrantReadWriteLock() {
this(false);
}
public ReentrantReadWriteLock(boolean var1) {
this.sync = (ReentrantReadWriteLock.Sync)(var1?new ReentrantReadWriteLock.FairSync():new ReentrantReadWriteLock.NonfairSync());
this.readerLock = new ReentrantReadWriteLock.ReadLock(this);
this.writerLock = new ReentrantReadWriteLock.WriteLock(this);
}
同步状态
同步状态表示锁被一个线程重复获取的次数. 而ReentrantReadWriteLock的自定义同步器Sync需要在同步状态(一个整型变量)上维护多个读线程和一个写线程的状态. 读写锁通过将该整型变量”按位切割使用”, 切分为两个部分, 高16位表示读, 低16位表示写
//ReentrantReadWriteLock.java: ReentrantReadWriteLock.Sync
// 获取写同步锁状态
static int exclusiveCount(int var0) {
return var0 & '\uffff';
}
// 获取读同步锁状态
static int sharedCount(int var0) {
return var0 >>> 16;
}
WriteLock 写锁
获取
获取锁的全过程: ReentrantReadWriteLock.WriteLock.lock() –> this.sync.acquire(1) (即 AbstractQueueSynchronizer.acquire(int var1)) –> ReentrantReadWriteLock.WriteLock.tryAcquire(1)
- 获取写锁成功: ReentrantReadWriteLock.WriteLock.tryAcquire(1)返回true, AbstractQueueSynchronizer.acquireQueued()返回true
- 获取写锁阻塞: ReentrantReadWriteLock.WriteLock.tryAcquire(1)返回false, AbstractQueueSynchronizer.acquireQueued()阻塞, 自旋锁
// ReentrantReadWriteLock.java: ReentrantReadWriteLock.WriteLock
public void lock() {
this.sync.acquire(1);
}
this.sync为ReentrantReadWriteLock自定义同步器Sync的实例(也是ReentrantReadWriteLock实例的成员变量), 是AbstractQueueSynchronizer的子类.
// AbstractQueueSynchronizer.java AbstractQueueSynchronizer
public final void acquire(int var1) {
if(!this.tryAcquire(var1) && this.acquireQueued(this.addWaiter(AbstractQueuedSynchronizer.Node.EXCLUSIVE), var1)) {
selfInterrupt();
}
}
由于this.sync重写了父类的tryAcquire()等方法, 所以this.tryAcquire
会调用重写后的方法
// ReentrantReadWriteLock.java: ReentrantReadWriteLock.WriteLock
protected final boolean tryAcquire(int var1) {
Thread var2 = Thread.currentThread();
int var3 = this.getState();
int var4 = exclusiveCount(var3); // 获取写状态
if(var3 != 0) {
// 支持重进入
if(var4 != 0 && var2 == this.getExcl