Spec-Zone.ru › OpenJDK 17

Интерфейс ReadWriteLock

Все известные реализующие классы:
ReentrantReadWriteLock
public interface ReadWriteLock
A ReadWriteLock поддерживает пару связанных locks, один для операций только для чтения и один для записи. Блокировка для чтения может быть одновременно удерживаема несколькими потоками чтения, если нет потоков записи. Блокировка для записи является эксклюзивной.

Все ReadWriteLock реализации должны гарантировать, что эффекты синхронизации памяти операций writeLock (как указано в Lock интерфейсе) также действуют в отношении связанных readLock. То есть поток, успешно получивший блокировку чтения, увидит все обновления, внесенные после предыдущего освобождения блокировки записи.

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

Будет ли блокировка чтения-записи улучшать производительность по сравнению с использованием блокировки взаимного исключения, зависит от частоты чтения данных по сравнению с их изменением, продолжительности операций чтения и записи и конкуренции за данные — то есть количества потоков, которые будут пытаться прочитать или записать данные одновременно. Например, коллекция, первоначально заполненная данными и впоследствии редко изменяемая, при этом часто ищущая (например, каталог некоторого типа) — идеальный кандидат для использования блокировки чтения-записи. Однако, если обновления становятся частыми, данные большую часть времени находятся в эксклюзивной блокировке, и увеличение параллельности невелико или отсутствует. Кроме того, если операции чтения слишком короткие, накладные расходы реализации блокировки чтения-записи (которая по своей природе более сложна, чем блокировка взаимного исключения) могут преобладать над стоимостью выполнения, особенно потому, что многие реализации блокировок чтения-записи все еще сериализуют все потоки через небольшой фрагмент кода. В конечном итоге только профилирование и измерения установят, подходит ли использование блокировки чтения-записи для вашего приложения.

Хотя основная работа блокировки чтения-записи проста, существует множество политических решений, которые должна принять реализация, что может повлиять на эффективность блокировки чтения-записи в данном приложении. Примеры таких политик включают:

  • Определение того, следует ли предоставить блокировку чтения или блокировку записи, когда ждут как читатели, так и записывающие, в момент, когда записывающий освобождает блокировку записи. Предпочтение записывающему обычно, поскольку ожидается, что записи будут короткими и редкими. Предпочтение читающему менее распространено, так как это может привести к значительным задержкам для записи, если читатели частые и долгоживущие, как ожидается.
  • Определение того, получают ли читатели, которые запрашивают блокировку чтения, в то время как активен читатель и ждет записывающий, блокировку чтения. Предпочтение читающему может неопределенно задерживать записывающего, в то время как предпочтение записывающему может уменьшить потенциальную параллельность.
  • Определение того, являются ли блокировки вложенными: может ли поток с блокировкой записи повторно получить её? Может ли он получить блокировку чтения, удерживая блокировку записи? Является ли сама блокировка чтения вложенной?
  • Может ли блокировка записи быть понижена до блокировки чтения без разрешения вмешательства записывающего? Может ли блокировка чтения быть повышена до блокировки записи, отдавая предпочтение другим ожидающим читателям или записывающим?
При оценке пригодности данной реализации для вашего приложения следует учесть все эти моменты.
С:
1.5
См. также:
  • ReentrantReadWriteLock
  • Lock
  • ReentrantLock

Краткое описание методов

Модификатор и тип Метод Описание
Lock readLock()
Возвращает блокировку, используемую для чтения.
Lock writeLock()
Возвращает блокировку, используемую для записи.

Подробное описание методов

readLock

Lock readLock()
Возвращает блокировку, используемую для чтения.
Возвращает:
блокировку, используемую для чтения

writeLock

Lock writeLock()
Возвращает блокировку, используемую для записи.
Возвращает:
блокировку, используемую для записи

© 1993, 2021, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/concurrent/locks/ReadWriteLock.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API