Интерфейс ReadWriteLock
- Все известные реализующие классы:
ReentrantReadWriteLock
public interface ReadWriteLock
ReadWriteLock поддерживает пару связанных locks, один для операций чтения и один для записи. Блокировка чтения может быть одновременной для нескольких нитей чтения, при условии отсутствия нитей записи. Блокировка записи является эксклюзивной. Все ReadWriteLock реализации должны гарантировать, что эффекты синхронизации памяти операций writeLock (как указано в интерфейсе Lock) также выполняются в отношении связанных readLock. То есть нить, успешно получившая блокировку чтения, увидит все обновления, сделанные после предыдущего освобождения блокировки записи.
Блокировка чтения-записи позволяет достичь более высокого уровня конкурентности при доступе к общим данным, чем это возможно с помощью блокировки взаимного исключения. Она использует тот факт, что, хотя только одна нить одновременно (нить записи) может изменять общие данные, во многих случаях любое количество нитей может одновременно читать данные (следовательно, нити чтения). Теоретически, увеличение конкурентности, достигнутое с помощью блокировки чтения-записи, приведет к улучшению производительности по сравнению с использованием блокировки взаимного исключения. На практике это увеличение конкурентности будет полностью реализовано только на многопроцессорной системе и только в том случае, если модели доступа к общим данным подходят.
Будет ли блокировка чтения-записи улучшать производительность по сравнению с использованием блокировки взаимного исключения, зависит от частоты чтения данных по сравнению с их модификацией, продолжительности операций чтения и записи, а также конкуренции за данные – то есть количества нитей, которые будут пытаться читать или записывать данные одновременно. Например, коллекция, которая изначально заполняется данными и впоследствии редко изменяется, но часто используется для поиска (например, каталог какой-либо структуры), является идеальным кандидатом для использования блокировки чтения-записи. Однако, если обновления происходят часто, данные большую часть времени блокируются исключительно, и увеличение конкурентности незначительно или отсутствует. Кроме того, если операции чтения слишком короткие, накладные расходы на реализацию блокировки чтения-записи (которая по своей сути более сложна, чем блокировка взаимного исключения) могут преобладать над стоимостью выполнения, особенно поскольку многие реализации блокировок чтения-записи все еще сериализуют все нити через небольшой фрагмент кода. В конечном итоге только профилирование и измерение установят, подходит ли использование блокировки чтения-записи для вашего приложения.
Хотя базовая работа блокировки чтения-записи проста, существует много политических решений, которые должна принять реализация, что может повлиять на эффективность блокировки чтения-записи в конкретном приложении. Примеры таких политик включают:
- Определение, следует ли предоставить блокировку чтения или блокировку записи, когда ждут как читатели, так и писатели, в момент, когда писатель освобождает блокировку записи. Преимущество записи является распространенным, так как ожидается, что записи будут короткими и редкими. Преимущество чтения встречается реже, поскольку это может привести к длительным задержкам для записи, если читатели являются частыми и долгоживущими, как ожидается.
- Определение, предоставляется ли блокировка чтения читателям, которые запрашивают блокировку чтения, когда активен читатель и ждет писатель. Преимущество для читателя может неопределенно задерживать писателя, в то время как преимущество для писателя может уменьшить потенциальную конкурентность.
- Определение, являются ли блокировки вложенными: может ли нить с блокировкой записи повторно получить ее? Может ли она получить блокировку чтения, удерживая блокировку записи? Сама блокировка чтения является вложенной?
- Можно ли понизить блокировку записи до блокировки чтения без разрешения промежуточной записи? Можно ли повысить блокировку чтения до блокировки записи, отдавая предпочтение другим ожидающим читателям или писателям?
- С:
- 1.5
- См. также:
Краткое описание методов
Подробное описание методов
readLock
Lock readLock()
- Возвращает:
- блокировку, используемую для чтения
writeLock
Lock writeLock()
- Возвращает:
- блокировку, используемую для записи
© 1993, 2025, 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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/util/concurrent/locks/ReadWriteLock.html