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
- Наследование
- Атрибуты
- Реализации
Комментарии
Реализация поддержки аналогичной 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(Boolean) |
Создает новую |
| ReentrantReadWriteLock(IntPtr, JniHandleOwnership) |
Конструктор, используемый при создании управляемых представлений объектов JNI; вызывается средой выполнения. |
Свойства
| Имя | Описание |
|---|---|
| Class |
Возвращает класс среды выполнения этого |
| Handle |
Дескриптор базового экземпляра Android. (Унаследовано от Object) |
| HasQueuedThreads |
Запрашивает, ожидают ли какие-либо потоки получить блокировку чтения или записи. |
| IsFair |
Возвращает значение |
| IsWriteLocked |
Запрашивает, если блокировка записи хранится любым потоком. |
| IsWriteLockedByCurrentThread |
Запросы, если блокировка записи хранится текущим потоком. |
| JniIdentityHashCode |
Возвращает хэш-код удостоверения, назначенный этому Java одноранговой среде выполнения взаимодействия. (Унаследовано от Object) |
| JniManagedPeerState |
Реализация поддержки аналогичной |
| JniPeerMembers |
Возвращает метаданные JNI, используемые для вызова элементов этого Java однорангового узла. |
| Owner |
Возвращает поток, который в настоящее время владеет блокировкой записи или |
| PeerReference |
Возвращает ссылку на объект JNI для этого Java однорангового узла. (Унаследовано от Object) |
| QueuedReaderThreads |
Возвращает коллекцию, содержащую потоки, которые могут ожидать получения блокировки чтения. |
| QueuedThreads |
Возвращает коллекцию, содержащую потоки, которые могут ожидать получения блокировки чтения или записи. |
| QueuedWriterThreads |
Возвращает коллекцию, содержащую потоки, которые могут ожидать получения блокировки записи. |
| QueueLength |
Возвращает оценку количества потоков, ожидающих получения блокировки чтения или записи. |
| ReadHoldCount |
Запрашивает количество повторных операций чтения, удерживаемых на этой блокировке текущим потоком. |
| ReadLockCount |
Запрашивает количество блокировок чтения, удерживаемых для этой блокировки. |
| ThresholdClass |
Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода. |
| ThresholdType |
Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода. |
| WriteHoldCount |
Запрашивает количество удержаний повторной записи в этой блокировке текущим потоком. |
Методы
| Имя | Описание |
|---|---|
| Clone() |
Создает и возвращает копию этого объекта. (Унаследовано от Object) |
| Construct(JniObjectReference, JniObjectReferenceOptions) |
Реализация поддержки аналогичной |
| Dispose() |
Освобождает ресурсы, удерживаемые этим Java одноранговым узлом. (Унаследовано от Object) |
| Dispose(Boolean) |
Освобождает ресурсы, удерживаемые этим Java одноранговым узлом. (Унаследовано от Object) |
| DisposeUnlessReferenced() |
Реализация поддержки аналогичной |
| Equals(Object) |
Реализация поддержки аналогичной |
| 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) |
Реализация поддержки аналогичной |
| 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() |
Реализация поддержки аналогичной |
| IJavaPeerable.Finalized() |
Реализация поддержки аналогичной |
| IJavaPeerable.JniObjectReferenceControlBlock |
Реализация поддержки аналогичной |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
Реализация поддержки аналогичной |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
Реализация поддержки аналогичной |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
Реализация поддержки аналогичной |
| IJavaPeerable.UnregisterFromRuntime() |
Реализация поддержки аналогичной |
Методы расширения
| Имя | Описание |
|---|---|
| GetJniTypeName(IJavaPeerable) |
Возвращает имя JNI типа экземпляра |
| JavaAs<TResult>(IJavaPeerable) |
Попробуйте принуждать к типу |
| JavaCast<TResult>(IJavaObject) |
Выполняет преобразование типа, проверяемого средой выполнения Android. |
| JavaCast<TResult>(IJavaObject) |
Реализация поддержки аналогичной |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
Попробуйте принуждать к типу |