1

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

有关于 ReentrantReadWriteLock 的 JavaDoc。它说明了有关锁的升级/降级的以下内容:

  • 锁降级...... 但是,从读锁升级到写锁是不可能的。

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

 // 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 行之间没有锁定,并且底层结构暴露于其他线程的更改。所以它不能被认为是升级锁的正确方法还是我在这里错过了什么?

4

1 回答 1

1

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

于 2010-05-23T08:44:56.207 回答