鍍金池/ 問(wèn)答/Java  Linux/ 在使用ReentrantReadWriteLock時(shí),關(guān)于鎖降級(jí)的一點(diǎn)疑問(wèn)?

在使用ReentrantReadWriteLock時(shí),關(guān)于鎖降級(jí)的一點(diǎn)疑問(wèn)?

在查看ReentrantReadWriteLock的官方文檔中看到了一個(gè)關(guān)于鎖降級(jí)的例子代碼:

 class CachedData {
   Object data;
   volatile boolean cacheValid;
   final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();

   void processCachedData() {
     rwl.readLock().lock();
     if (!cacheValid) {
       // Must release read lock before acquiring write lock
       rwl.readLock().unlock();
       rwl.writeLock().lock();
       try {
         // Recheck state because another thread might have
         // acquired write lock and changed state before we did.
         if (!cacheValid) {
           data = ...
           cacheValid = true;
         }
         // Downgrade by acquiring read lock before releasing write lock
         rwl.readLock().lock();
       } finally {
         rwl.writeLock().unlock(); // Unlock write, still hold read
       }
     }

     try {
       use(data);
     } finally {
       rwl.readLock().unlock();
     }
   }
 }

這里,在釋放寫(xiě)鎖前需要先申請(qǐng)讀鎖,也既鎖降級(jí)。具體原因是,如果不先獲取讀鎖就釋放寫(xiě)鎖,那么在執(zhí)行后面的use(data)時(shí),data有可能被其它線程修改。而由于一個(gè)線程對(duì)于共享變量的修改對(duì)另一個(gè)線程來(lái)說(shuō)是不可見(jiàn)的,所以會(huì)導(dǎo)致錯(cuò)誤。這里,請(qǐng)問(wèn),如果我把data變量用volatile修飾,通過(guò)volatile來(lái)保證可見(jiàn)性的話,是否還需要使用鎖降級(jí)呢?不知道我對(duì)于volatile保證可見(jiàn)性的理解是否正確?

回答
編輯回答
編輯回答
敢試

我根本無(wú)法理解為什么要降級(jí),你用寫(xiě)鎖更新完了數(shù)據(jù),別的線程同樣需要進(jìn)行寫(xiě)操作,自然鎖釋放后即可拿到,你又套了個(gè)讀鎖的意義在哪?。。。業(yè)務(wù)上有沒(méi)有具體應(yīng)用呢?

2017年11月13日 04:35
編輯回答
吃藕丑

這里鎖釋放時(shí),會(huì)把data刷會(huì)共享內(nèi)存及主內(nèi)存的。不存在可見(jiàn)性了吧 鎖降級(jí)的主要目的應(yīng)該還是在邏輯上。我覺(jué)得因?yàn)閷?xiě)讀互斥,所以我們一直持有寫(xiě)鎖的話,其他線程就無(wú)法讀了,所以

2017年6月21日 22:36