亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在使用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 關注
  • 614 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號