为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

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

2 回答

?
倚天杖

TA贡献1828条经验 获得超3个赞

这里锁释放时,会把data刷会共享内存及主内存的。不存在可见性了吧锁降级的主要目的应该还是在逻辑上。我觉得因为写读互斥,所以我们一直持有写锁的话,其他线程就无法读了,所以
                            
查看完整回答
反对 回复 2019-05-22
?
隔江千里

TA贡献1906条经验 获得超10个赞

我根本无法理解为什么要降级,你用写锁更新完了数据,别的线程同样需要进行写操作,自然锁释放后即可拿到,你又套了个读锁的意义在哪?。。。业务上有没有具体应用呢?
                            
查看完整回答
反对 回复 2019-05-22
  • 2 回答
  • 0 关注
  • 582 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信