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 に答える