免責事項:私は 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 の間にロックがなく、基になる構造が他のスレッドからの変更にさらされていることを意味します。したがって、ロックをアップグレードする正しい方法と見なすことはできませんか、それともここで何か見逃していますか?