在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

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

在使用ReentrantReadWriteLock時,關(guān)于鎖降級的一點疑問?

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

 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();
     }
   }
 }

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

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

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

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

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

2017年6月21日 22:36