- 写锁比读锁的优先级要高,拥有写锁之后还可以再获取读锁,但是拥有读锁的线程在释放前无法再获取写锁。
- 允许锁降级,即从写锁降级为读锁,实现的步骤是:先获取写锁,再获取读锁,然后释放写锁。不允许从读锁升级为写锁。
class CacheDemo{
Object data;
volatile boolean isCacheValid;
ReetrantReadWriteLock rwl = new ReetrantReadWriteLoack();
void useCachedData(){
rwl.readLock().lock();//获取读锁
if(isCacheValid == false){
rwl.readLock.unlock();//在获取写锁之前必须先释放读锁
rwl.writeLock.lock();//获取写锁
if(isCacheValid == false){//必须再判断一次,因为有可能别的线程刚修改了数据
data = getData();//cache无效,获取新的数据
isCacheValid = true;
}
rwl.readLock().lock();//获取读锁
rwl.writeLock.unlock();//释放写锁,完成锁降级
}
process(data);
rwl.readLock.unlock();//使用完之后释放读锁
}
}