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