代码之家  ›  专栏  ›  技术社区  ›  Andrey Taptunov

java.util.concurrent.locks.ReentranTreadWriteLock的文档

  •  1
  • Andrey Taptunov  · 技术社区  · 14 年前

    免责声明: 我不是很擅长Java,只是比较了C和Java之间的读/写锁,以便更好地理解这个主题和两种实现背后的决定。

    There is JavaDoc about ReentrantReadWriteLock . 它对锁的升级/降级说明如下:

    • 锁定降级 但是,无法从读锁升级到写锁。

    它还具有以下示例,显示从读锁到写锁的手动升级:

     // Here is a code sketch showing how to exploit reentrancy 
     // to perform lock downgrading after updating a cache
    
     void processCachedData() {
     rwl.readLock().lock();
     if (!cacheValid) {
        // upgrade lock manually
        #1: rwl.readLock().unlock();   // must unlock first to obtain writelock
        #2: rwl.writeLock().lock();
        if (!cacheValid) { // recheck
           ...
        }
       ...
     }
     use(data);
     rwl.readLock().unlock();
    

    这是否意味着上面的示例在某些情况下可能行为不正确-我的意思是行1&2之间没有锁,底层结构暴露在来自其他线程的更改中。所以它不能被认为是升级锁的正确方法,还是我错过了什么?

    1 回复  |  直到 14 年前
        1
  •  1
  •   tangens    14 年前

    是的,你是对的。但是这个代码通过调用 if (!cacheValid) { // recheck 在它获得写锁之后。

    推荐文章