Spec-Zone.ru › OpenJDK 8

Интерфейс ReadWriteLock

Все известные реализующие классы:
ReentrantReadWriteLock

public interface ReadWriteLock

Класс ReadWriteLock поддерживает пару связанных locks, один для операций чтения и один для записи. read lock может одновременно удерживаться несколькими потоками чтения, при условии отсутствия потоков записи. write lock — это исключительная блокировка.

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

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

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

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

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

Методы

Модификатор и тип Метод и описание
Lock readLock()

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

Lock writeLock()

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

Методы

readLock

Lock readLock()

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

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

writeLock

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.

Spec-Zone.ru

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