Отказ от ответственности: Я не очень хорош в Java и просто сравниваю блокировки чтения / записи между C # и Java, чтобы лучше понять эту тему и решения, стоящие за обеими реализациями.
Существует JavaDoc о 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, и базовая структура подвержена изменениям из других потоков. Так что это не может считаться правильным способом обновить блокировку или я что-то здесь упускаю?