Что такое обновление / понижение ReentrantReadWriteLock? - PullRequest
8 голосов
/ 21 февраля 2011

Что такое повышение / понижение ReentrantReadWriteLock? Я вижу javadoc о повышении / понижении:

"Понижение блокировки: Повторный вход также позволяет понизить блокировку записи до блокировки чтения, получив блокировку записи, затем блокировку чтения и затем сняв блокировку записи. Однако обновление с блокировки чтения на блокировку записи невозможно. "

И предоставленный образец:

class CachedData {
   Object data;
   volatile boolean cacheValid;
   ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();

   void processCachedData() {
     rwl.readLock().lock();
     if (!cacheValid) {
        // upgrade lock manually
        rwl.readLock().unlock();   // must unlock first to obtain writelock
        rwl.writeLock().lock();
        if (!cacheValid) { // recheck
          data = ...
          cacheValid = true;
        }
        // downgrade lock
        rwl.readLock().lock();  // reacquire read without giving up write lock
        rwl.writeLock().unlock(); // unlock write, still hold read
     }

     use(data);
     rwl.readLock().unlock();
   }
 }

Я знаю, что это говорит об отношениях между readLock и writeLock, но я не смог получить четкую концепцию из документа. Не могли бы вы дать мне немного больше объяснений? Спасибо!

1 Ответ

13 голосов
/ 21 февраля 2011

Я полагаю, что в этом контексте идея «обновления» и «понижения» основана на идее, что блокировка считывателя является, в некотором смысле, «более слабой» блокировкой, чем блокировка записывающего устройства.Когда блокировка записи получена, никакие другие потоки не могут получить блокировку в любой форме, тогда как с блокировкой считывателя любой другой поток может получить блокировку чтения, если он хочет.

Здесь «понижение» блокировки означаетчто если вы удерживаете блокировку записи, вы можете переключиться на удержание только блокировки чтения, получив блокировку чтения и затем сняв блокировку записи.Это означает, что у вас может быть поток, который начинает делать что-то критически важное (что-то, что мешает другим потокам читать), выполняет свою работу, а затем переключается на блокировку с более низким приоритетом (блокировку чтения), даже не будучи без блокировки,Это позволяет вам удерживать блокировку непрерывно, не получая вытеснения.

Однако другой способ не работает - удерживая блокировку чтения, вы не можете «обновить» до удержания более важной записизаблокировать, пытаясь получить блокировку записи.Если вы попытаетесь это сделать, поток просто заблокируется, пока не прервется.

Надеюсь, это поможет!

...