猿问

在使用ReentrantReadWriteLock时,关于锁降级的一点疑问?

在查看ReentrantReadWriteLock的官方文档中看到了一个关于锁降级的例子代码:
classCachedData{
Objectdata;
volatilebooleancacheValid;
finalReentrantReadWriteLockrwl=newReentrantReadWriteLock();
voidprocessCachedData(){
rwl.readLock().lock();
if(!cacheValid){
//Mustreleasereadlockbeforeacquiringwritelock
rwl.readLock().unlock();
rwl.writeLock().lock();
try{
//Recheckstatebecauseanotherthreadmighthave
//acquiredwritelockandchangedstatebeforewedid.
if(!cacheValid){
data=...
cacheValid=true;
}
//Downgradebyacquiringreadlockbeforereleasingwritelock
rwl.readLock().lock();
}finally{
rwl.writeLock().unlock();//Unlockwrite,stillholdread
}
}
try{
use(data);
}finally{
rwl.readLock().unlock();
}
}
}
这里,在释放写锁前需要先申请读锁,也既锁降级。具体原因是,如果不先获取读锁就释放写锁,那么在执行后面的use(data)时,data有可能被其它线程修改。而由于一个线程对于共享变量的修改对另一个线程来说是不可见的,所以会导致错误。这里,请问,如果我把data变量用volatile修饰,通过volatile来保证可见性的话,是否还需要使用锁降级呢?不知道我对于volatile保证可见性的理解是否正确?
沧海一幻觉
浏览 583回答 2
2回答

倚天杖

这里锁释放时,会把data刷会共享内存及主内存的。不存在可见性了吧锁降级的主要目的应该还是在逻辑上。我觉得因为写读互斥,所以我们一直持有写锁的话,其他线程就无法读了,所以

隔江千里

我根本无法理解为什么要降级,你用写锁更新完了数据,别的线程同样需要进行写操作,自然锁释放后即可拿到,你又套了个读锁的意义在哪?。。。业务上有没有具体应用呢?
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答