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