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

1 ответ

Решение

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

Другие вопросы по тегам