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

时间:2010-05-23 08:41:54

标签: java reentrantreadwritelock

免责声明:我不擅长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行和第1行之间没有锁定#2和底层结构暴露于来自其他线程的更改。所以它不能被认为是升级锁的正确方法,还是我错过了什么?

1 个答案:

答案 0 :(得分:1)

是的,你是对的。但是这段代码通过在获取写锁定后再次调用if (!cacheValid) { // recheck来处理这种情况。