Документация для java.util.concurrent.locks.ReentrantReadWriteLock - PullRequest
1 голос
/ 23 мая 2010

Отказ от ответственности: Я не очень хорош в 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 Ответ

1 голос
/ 23 мая 2010

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

...