Документация для java.util.concurrent.locks.ReentrantReadWriteLock

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


person Andrey Taptunov    schedule 23.05.2010    source источник


Ответы (1)


Да, ты прав. Но этот код обрабатывает ситуацию, снова вызывая if (!cacheValid) { // recheck после получения блокировки записи.

person tangens    schedule 23.05.2010
comment
Спасибо, если честно, не обратил внимания на двойную проверку переменной cacheValid. - person Andrey Taptunov; 23.05.2010