ReadWriteRentrantLock

Мое понимание RentrantReadWriteLock заключается в том, что он допускает много операций чтения одновременно, но только одну запись.

Когда мы пытаемся получить блокировку чтения, doc

Acquires the read lock if the write lock is not held by another thread and returns immediately.

If the write lock is held by another thread then the current thread becomes disabled 
for thread scheduling purposes and lies dormant until the read lock has been acquired.

что здесь означает held?

  • Другой поток запросил блокировку записи и выполняется, чем писать?

or

  • Вышеупомянутое и случай, когда другой поток запросил блокировку записи, но ожидает ее получения.

Потому что, когда запрашивается блокировка записи, она не предоставляется, если

  • У кого-то еще есть блокировка записи
  • У кого-то еще есть блокировка чтения

Из блокировка записи документ:

Acquires the write lock if neither the read nor write lock are held by another 
thread and returns immediately, setting the write lock hold count to one.

...

If the lock is held by another thread then the current thread becomes 
disabled for thread scheduling purposes and lies dormant until the write lock has 
been acquired, at which time the write lock hold count is set to one.

Поэтому, когда поток ожидает блокировку записи после ее запроса, я просто хочу получить представление о последующем поведении вызовов блокировки чтения. Делают ли они запрос на блокировку записи еще дольше или нет?


person More Than Five    schedule 30.03.2013    source источник


Ответы (2)


Удерживается в этом контексте означает, что блокировка была запрошена и предоставлена. Он не считается задержанным, если вы его просто ждете.

Известна проблема с ReentrantReadWriteLock, когда большое количество потоков запрашивает блокировки. Д-р Хайнц Кабуц подготовил вместе с ними интересное информационное письмо о нехватке блокировок.

Я понимаю, что многие из этих проблем были исправлены в новой Java 7 Phaser, но я еще недостаточно знаком с ним, чтобы говорить так или иначе.

person OldCurmudgeon    schedule 30.03.2013
comment
как бы то ни было, фазер не вызвал проблем с голоданием. скорее StampedLock имеет. - person John Vint; 30.03.2013

что значит здесь?

блокировка была запрошена И получена.

Поэтому, когда поток ожидает блокировку записи после ее запроса, я просто хочу получить представление о последующем поведении вызовов блокировки чтения. Делают ли они запрос на блокировку записи еще дольше или нет?

Если на каком-то этапе все ваши блокировки чтения были сняты, вызов lock.writeLock().lock() успешно установит блокировку записи. Обратите внимание, однако, что более чем один поток может удерживать блокировку чтения, поэтому, если у вас есть один или несколько потоков, постоянно удерживающих блокировку чтения, никакой другой поток не сможет получить блокировку записи, и у вас возникнет серьезная проблема с живучестью.

person assylias    schedule 30.03.2013