ReentrantReadWriteLock Класс

Определение

Реализация поддержки аналогичной ReadWriteLock семантики ReentrantLock.

[Android.Runtime.Register("java/util/concurrent/locks/ReentrantReadWriteLock", DoNotGenerateAcw=true)]
public class ReentrantReadWriteLock : Java.Lang.Object, IDisposable, Java.IO.ISerializable, Java.Util.Concurrent.Locks.IReadWriteLock
[<Android.Runtime.Register("java/util/concurrent/locks/ReentrantReadWriteLock", DoNotGenerateAcw=true)>]
type ReentrantReadWriteLock = class
    inherit Object
    interface ISerializable
    interface IJavaObject
    interface IDisposable
    interface IJavaPeerable
    interface IReadWriteLock
Наследование
ReentrantReadWriteLock
Атрибуты
Реализации

Комментарии

Реализация поддержки аналогичной ReadWriteLock семантики ReentrantLock.

Этот класс имеет следующие свойства:

<Заказ на приобретение> ul<><li>b</b>

Этот класс не накладывает порядок параметров чтения или записи для доступа к блокировке. Однако она поддерживает необязательную <>политику справедливости< или em>.

<dl><dt><b>Non-fair mode (default)</b><dd>При построении как несправедливого (по умолчанию), порядок записи для блокировки чтения и записи не определен, при условии повторного ввода. Блокировка, которая постоянно утверждается, может на неопределенный срок отложить один или несколько потоков чтения или записи, но обычно будет иметь более высокую пропускную способность, чем справедливая блокировка.

<dt><b>Fair mode</b><dd>При построении как справедливое, потоки утверждают за запись с использованием приблизительно политики порядка прибытия. При выпуске блокировки, которая находится в данный момент, будет назначена блокировка записи в течение длительного времени или группа потоков чтения, ожидающих, чем все потоки записи ожидания, эта группа будет назначена блокировке чтения.

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

Поток, который пытается получить справедливую блокировку записи (не повторно) блокируется, если только блокировка чтения и блокировка записи не являются бесплатными (это означает, что потоки ожидания отсутствуют). (Обратите внимание, что неблокирующие ReadLock#tryLock() и WriteLock#tryLock() методы не учитывают этот справедливый параметр и немедленно получат блокировку, если это возможно, независимо от ожидающих потоков.) </dl>

<li><b>Reentrancy</b>

Эта блокировка позволяет читателям и писателям повторно выполнять чтение или запись блокировок в стиле ReentrantLock. Неотступные читатели не допускаются до тех пор, пока не будут выпущены все блокировки записи, удерживаемые потоком записи.

Кроме того, модуль записи может получить блокировку чтения, но не наоборот. Среди других приложений повторное применение может быть полезно при фиксации блокировок записи во время вызовов или обратных вызовов методам, выполняющим операции чтения под блокировками чтения. Если читатель пытается получить блокировку записи, она никогда не будет успешной.

<li><b>Lock downgrading</b>

Повторное выполнение также позволяет уменьшить уровень от блокировки записи до блокировки чтения, получив блокировку записи, а затем блокировку чтения, а затем освободить блокировку записи. Однако обновление с блокировки чтения до блокировки <>записи невозможно.<>

<li><b>Прерывание приобретения< блокировки/b>

Блокировка чтения и блокировка записи поддерживают прерывание при приобретении блокировки.

<li><b>Condition support</b>

Блокировка записи обеспечивает Condition реализацию, которая ведет себя так же, как и блокировка записи, так как Condition реализация, предоставляемая ReentrantLock#newCondition им ReentrantLock. Это Condition , конечно, может использоваться только с блокировкой записи.

Блокировка чтения не поддерживает Condition и readLock().newCondition() вызывает исключение UnsupportedOperationException.

<li><b>Инструментирование</b>

Этот класс поддерживает методы для определения того, удерживаются ли блокировки или утверждаются. Эти методы предназначены для мониторинга состояния системы, а не для управления синхронизацией. </ul>

Сериализация этого класса ведет себя так же, как и встроенные блокировки: десериализированная блокировка находится в разблокированном состоянии независимо от его состояния при сериализации.

<Примеры>использования.</b> Вот эскиз кода, показывающий, как выполнить понижение уровня блокировки после обновления кэша (обработка исключений особенно сложна при обработке нескольких блокировок в неложенном режиме):

{@code
            class CachedData {
              Object data;
              boolean cacheValid;
              final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();

              void processCachedData() {
                rwl.readLock().lock();
                if (!cacheValid) {
                  // Must release read lock before acquiring write lock
                  rwl.readLock().unlock();
                  rwl.writeLock().lock();
                  try {
                    // Recheck state because another thread might have
                    // acquired write lock and changed state before we did.
                    if (!cacheValid) {
                      data = ...;
                      cacheValid = true;
                    }
                    // Downgrade by acquiring read lock before releasing write lock
                    rwl.readLock().lock();
                  } finally {
                    rwl.writeLock().unlock(); // Unlock write, still hold read
                  }
                }

                try {
                  use(data);
                } finally {
                  rwl.readLock().unlock();
                }
              }
            }}

ReentrantReadWriteLocks можно использовать для улучшения параллелизма в некоторых видах коллекций. Это обычно стоит, только если коллекции, как ожидается, будут большими, доступ к которым осуществляется более потоков чтения, чем потоки записи, и влечет за собой операции с затратами на синхронизацию, которые перевешивают затраты на синхронизацию. Например, вот класс с помощью TreeMap, который, как ожидается, будет большим и параллельным доступом.

{@code
            class RWDictionary {
              private final Map<String, Data> m = new TreeMap<>();
              private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
              private final Lock r = rwl.readLock();
              private final Lock w = rwl.writeLock();

              public Data get(String key) {
                r.lock();
                try { return m.get(key); }
                finally { r.unlock(); }
              }
              public List<String> allKeys() {
                r.lock();
                try { return new ArrayList<>(m.keySet()); }
                finally { r.unlock(); }
              }
              public Data put(String key, Data value) {
                w.lock();
                try { return m.put(key, value); }
                finally { w.unlock(); }
              }
              public void clear() {
                w.lock();
                try { m.clear(); }
                finally { w.unlock(); }
              }
            }}

<Заметки> о реализации h2</h2>

Эта блокировка поддерживает не более 65535 рекурсивных блокировок записи и 65535 блокировок чтения. Попытки превышения этих ограничений приводят к Error возникновению вызовов методов блокировки.

Добавлено в версии 1.5.

Java документации по java.util.concurrent.locks.ReentrantReadWriteLock.

Части этой страницы — это изменения на основе работы, созданной и общей Project и используемых в соответствии с условиями, описанными в разделе "".

Конструкторы

Имя Описание
ReentrantReadWriteLock()

Создает новый ReentrantReadWriteLock объект со свойствами упорядочения по умолчанию (nonfair).

ReentrantReadWriteLock(Boolean)

Создает новую ReentrantReadWriteLock с заданной политикой справедливости.

ReentrantReadWriteLock(IntPtr, JniHandleOwnership)

Конструктор, используемый при создании управляемых представлений объектов JNI; вызывается средой выполнения.

Свойства

Имя Описание
Class

Возвращает класс среды выполнения этого Objectобъекта.

(Унаследовано от Object)
Handle

Дескриптор базового экземпляра Android.

(Унаследовано от Object)
HasQueuedThreads

Запрашивает, ожидают ли какие-либо потоки получить блокировку чтения или записи.

IsFair

Возвращает значение true , если эта блокировка имеет значение true.

IsWriteLocked

Запрашивает, если блокировка записи хранится любым потоком.

IsWriteLockedByCurrentThread

Запросы, если блокировка записи хранится текущим потоком.

JniIdentityHashCode

Возвращает хэш-код удостоверения, назначенный этому Java одноранговой среде выполнения взаимодействия.

(Унаследовано от Object)
JniManagedPeerState

Реализация поддержки аналогичной ReadWriteLock семантики ReentrantLock.

(Унаследовано от JavaObject)
JniPeerMembers

Возвращает метаданные JNI, используемые для вызова элементов этого Java однорангового узла.

Owner

Возвращает поток, который в настоящее время владеет блокировкой записи или null если он не принадлежит.

PeerReference

Возвращает ссылку на объект JNI для этого Java однорангового узла.

(Унаследовано от Object)
QueuedReaderThreads

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

QueuedThreads

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

QueuedWriterThreads

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

QueueLength

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

ReadHoldCount

Запрашивает количество повторных операций чтения, удерживаемых на этой блокировке текущим потоком.

ReadLockCount

Запрашивает количество блокировок чтения, удерживаемых для этой блокировки.

ThresholdClass

Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода.

ThresholdType

Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода.

WriteHoldCount

Запрашивает количество удержаний повторной записи в этой блокировке текущим потоком.

Методы

Имя Описание
Clone()

Создает и возвращает копию этого объекта.

(Унаследовано от Object)
Construct(JniObjectReference, JniObjectReferenceOptions)

Реализация поддержки аналогичной ReadWriteLock семантики ReentrantLock.

(Унаследовано от JavaObject)
Dispose()

Освобождает ресурсы, удерживаемые этим Java одноранговым узлом.

(Унаследовано от Object)
Dispose(Boolean)

Освобождает ресурсы, удерживаемые этим Java одноранговым узлом.

(Унаследовано от Object)
DisposeUnlessReferenced()

Реализация поддержки аналогичной ReadWriteLock семантики ReentrantLock.

(Унаследовано от JavaObject)
Equals(Object)

Реализация поддержки аналогичной ReadWriteLock семантики ReentrantLock.

(Унаследовано от JavaObject)
Equals(Object)

Указывает, равен ли другой объект этому объекту.

(Унаследовано от Object)
GetHashCode()

Возвращает хэш-значение кода для объекта.

(Унаследовано от Object)
GetWaitingThreads(ICondition)

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

GetWaitQueueLength(ICondition)

Возвращает оценку количества потоков, ожидающих заданного условия, связанного с блокировкой записи.

HasQueuedThread(Thread)

Запрашивает, ожидает ли данный поток получить блокировку чтения или записи.

HasWaiters(ICondition)

Запрашивает, ожидают ли потоки заданного условия, связанного с блокировкой записи.

JavaFinalize()

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

(Унаследовано от Object)
Notify()

Просыпается один поток, ожидающий монитора этого объекта.

(Унаследовано от Object)
NotifyAll()

Просыпает все потоки, ожидающие монитора этого объекта.

(Унаследовано от Object)
ReadLock()

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

SetHandle(IntPtr, JniHandleOwnership)

Задает свойство Handle.

(Унаследовано от Object)
SetPeerReference(JniObjectReference, JniObjectReferenceOptions)

Реализация поддержки аналогичной ReadWriteLock семантики ReentrantLock.

(Унаследовано от JavaObject)
ToArray<T>()

Создает управляемый массив из этого Java оболочки массива.

(Унаследовано от Object)
ToString()

Возвращает строковое представление объекта.

(Унаследовано от Object)
UnregisterFromRuntime()

Отменяет регистрацию этого Java однорангового узла из среды выполнения взаимодействия.

(Унаследовано от Object)
Wait()

Приводит к тому, что текущий поток будет ждать, пока он не проснется, как правило, путем <><уведомления/>em или <эм>прерванного</em.>

(Унаследовано от Object)
Wait(Int64, Int32)

Приводит к тому, что текущий поток будет ждать, пока он не проснется, как правило, при <>получении уведомления</>em или <>эм прерваны< или> до тех пор, пока не истекло определенное количество реального времени.

(Унаследовано от Object)
Wait(Int64)

Приводит к тому, что текущий поток будет ждать, пока он не проснется, как правило, при <>получении уведомления</>em или <>эм прерваны< или> до тех пор, пока не истекло определенное количество реального времени.

(Унаследовано от Object)
WriteLock()

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

Явные реализации интерфейса

Имя Описание
IJavaPeerable.Disposed()

Реализация поддержки аналогичной ReadWriteLock семантики ReentrantLock.

(Унаследовано от JavaObject)
IJavaPeerable.Finalized()

Реализация поддержки аналогичной ReadWriteLock семантики ReentrantLock.

(Унаследовано от JavaObject)
IJavaPeerable.JniObjectReferenceControlBlock

Реализация поддержки аналогичной ReadWriteLock семантики ReentrantLock.

(Унаследовано от JavaObject)
IJavaPeerable.SetJniIdentityHashCode(Int32)

Реализация поддержки аналогичной ReadWriteLock семантики ReentrantLock.

(Унаследовано от JavaObject)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

Реализация поддержки аналогичной ReadWriteLock семантики ReentrantLock.

(Унаследовано от JavaObject)
IJavaPeerable.SetPeerReference(JniObjectReference)

Реализация поддержки аналогичной ReadWriteLock семантики ReentrantLock.

(Унаследовано от JavaObject)
IJavaPeerable.UnregisterFromRuntime()

Реализация поддержки аналогичной ReadWriteLock семантики ReentrantLock.

Методы расширения

Имя Описание
GetJniTypeName(IJavaPeerable)

Возвращает имя JNI типа экземпляра self.

JavaAs<TResult>(IJavaPeerable)

Попробуйте принуждать к типуself, проверяяTResult, является ли приведение допустимым на стороне Java.

JavaCast<TResult>(IJavaObject)

Выполняет преобразование типа, проверяемого средой выполнения Android.

JavaCast<TResult>(IJavaObject)

Реализация поддержки аналогичной ReadWriteLock семантики ReentrantLock.

TryJavaCast<TResult>(IJavaPeerable, TResult)

Попробуйте принуждать к типуself, проверяяTResult, является ли приведение допустимым на стороне Java.

Применяется к