在查看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保證可見性的理解是否正確?
在使用ReentrantReadWriteLock時,關于鎖降級的一點疑問?
滄海一幻覺
2019-05-22 16:52:55
