Spec-Zone.ru › OpenJDK 21

Интерфейс 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, 2023, 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/21/docs/api/java.base/java/util/concurrent/locks/ReadWriteLock.html

Spec-Zone.ru

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