StampedLock Класс

Определение

Блокировка на основе возможностей с тремя режимами управления доступом на чтение и запись.

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

Комментарии

Блокировка на основе возможностей с тремя режимами управления доступом на чтение и запись. Состояние StampedLock состоит из версии и режима. Методы приобретения блокировки возвращают метку, представляющую и контролирующую доступ к состоянию блокировки; Версии этих методов могут вместо этого возвращать специальное значение нулю, представляющее ошибку получения доступа. Методы выпуска блокировки и преобразования требуют меток в качестве аргументов и завершаются ошибкой, если они не соответствуют состоянию блокировки. Три режима:

<Ул>

<li><b>Writing.<Метод > /b#writeLock, возможно, блокирует ожидание эксклюзивного доступа, возвращая метку, которую можно использовать в методе #unlockWrite для освобождения блокировки. Кроме того, предоставляются незапланированные и временные версии tryWriteLock . Если блокировка хранится в режиме записи, блокировка чтения не может быть получена, и все оптимистические проверки чтения завершаются ошибкой.

<li><b>Чтение.<Метод > /b#readLock, возможно, блокирует ожидание неисключающего доступа, возвращая метку, которую можно использовать в методе #unlockRead для освобождения блокировки. Кроме того, предоставляются незапланированные и временные версии tryReadLock .

<li><b>Оптимистическое чтение.<Метод > /b#tryOptimisticRead возвращает метку без нуля, только если блокировка в настоящее время не хранится в режиме записи. Метод #validate возвращает значение true, если блокировка не была приобретена в режиме записи с момента получения заданной метки, в этом случае все действия до последнего выпуска блокировки записи происходят до выполнения действий после вызова tryOptimisticReadвызова. Этот режим можно рассматривать как чрезвычайно слабую версию блокировки чтения, которая может быть нарушена средством записи в любое время. Использование оптимистичного режима чтения для коротких сегментов кода только для чтения часто уменьшает удобочитание и повышает пропускную способность. Однако его использование по сути является хрупким. Оптимистические разделы чтения должны читать только поля и хранить их в локальных переменных для последующего использования после проверки. Поля считываются в оптимистическом режиме чтения, поэтому использование применяется только в том случае, если вы достаточно знакомы с представлениями данных для проверки согласованности и (или) многократного вызова метода validate(). Например, такие шаги обычно требуются при первом чтении ссылки на объект или массив, а затем доступ к одному из его полей, элементов или методов.

</ul>

Этот класс также поддерживает методы, которые условно предоставляют преобразования в трех режимах. Например, метод #tryConvertToWriteLock пытается "обновить" режим, возвращая допустимую метку записи, если (1) уже в режиме записи (2) в режиме чтения нет других читателей или (3) в оптимистическом режиме чтения и блокировка доступна. Формы этих методов предназначены для уменьшения некоторых больших двоичных объектов кода, которые в противном случае возникают в проектах на основе повторных попыток.

МеткиLocks предназначены для использования в качестве внутренних служебных программ в разработке потоковобезопасных компонентов. Их использование зависит от знаний о внутренних свойствах данных, объектов и методов, которые они защищают. Они не возвращаются повторно, поэтому заблокированные тела не должны вызывать другие неизвестные методы, которые могут попытаться повторно приобрести блокировки (хотя вы можете передать метку другим методам, которые могут использовать или преобразовать его). Использование режимов блокировки чтения зависит от связанных разделов кода без побочных эффектов. Неоцененные оптимистические разделы чтения не могут вызывать методы, которые не знают, что допускают потенциальные несоответствия. Метки используют конечные представления и не криптографически защищены (т. е. допустимая метка может быть угадываемой). Значения меток могут перезапуститься после (не раньше) одного года непрерывной работы. Метка, удерживаемая без использования или проверки дольше, чем этот период, может не проверить правильно. StampedLocks можно сериализовать, но всегда десериализировать в исходное разблокированное состояние, поэтому они не полезны для удаленной блокировки.

Например java.util.concurrent.Semaphore Semaphore, но в отличие от большинства Lock реализаций, StampedLocks не имеют понятия владения. Блокировки, приобретенные в одном потоке, могут быть освобождены или преобразованы в другой.

Политика планирования StampedLock не всегда предпочитает читателей по сравнению с писателями или наоборот. Все методы try являются лучшими усилиями и не обязательно соответствуют какой-либо политике планирования или справедливости. Нулевой возврат от любого метода try для получения или преобразования блокировок не содержит никакой информации о состоянии блокировки; Последующий вызов может завершиться успешно.

Так как он поддерживает координированное использование в нескольких режимах блокировки, этот класс не реализует Lock напрямую интерфейсы или ReadWriteLock интерфейсы. Однако в приложениях, требующих только связанного набора функциональных возможностей, можно просмотреть #asReadLock()#asWriteLock()файл StampedLock или #asReadWriteLock() в приложениях.

<B>Синхронизация памяти.<Методы /b> с эффектом успешной блокировки в любом режиме имеют те же эффекты синхронизации памяти, что <и действие em>Lock</em>, как описано в главе 17 <cite>The Java Language Specification</cite>. Методы успешно разблокировки в режиме записи имеют те же эффекты синхронизации памяти, что <и действие em>Unlock</em> . При оптимистических использовании операций чтения действия до последнего действия разблокировки режима записи гарантированно происходят перед выполнением действия tryOptimisticRead только в том случае, если последняя проверка возвращает значение true; в противном случае не гарантируется, что операции чтения между tryOptimisticRead и проверка получения согласованного моментального снимка.

<b>Пример использования.</b> Ниже показаны идиомы использования в классе, который поддерживает простые двухмерные точки. Пример кода иллюстрирует некоторые соглашения try/catch, несмотря на то, что они не требуются здесь, так как исключения не могут возникать в их телах.

{@code
            class Point {
              private double x, y;
              private final StampedLock sl = new StampedLock();

              // an exclusively locked method
              void move(double deltaX, double deltaY) {
                long stamp = sl.writeLock();
                try {
                  x += deltaX;
                  y += deltaY;
                } finally {
                  sl.unlockWrite(stamp);
                }
              }

              // a read-only method
              // upgrade from optimistic read to read lock
              double distanceFromOrigin() {
                long stamp = sl.tryOptimisticRead();
                try {
                  retryHoldingLock: for (;; stamp = sl.readLock()) {
                    if (stamp == 0L)
                      continue retryHoldingLock;
                    // possibly racy reads
                    double currentX = x;
                    double currentY = y;
                    if (!sl.validate(stamp))
                      continue retryHoldingLock;
                    return Math.hypot(currentX, currentY);
                  }
                } finally {
                  if (StampedLock.isReadLockStamp(stamp))
                    sl.unlockRead(stamp);
                }
              }

              // upgrade from optimistic read to write lock
              void moveIfAtOrigin(double newX, double newY) {
                long stamp = sl.tryOptimisticRead();
                try {
                  retryHoldingLock: for (;; stamp = sl.writeLock()) {
                    if (stamp == 0L)
                      continue retryHoldingLock;
                    // possibly racy reads
                    double currentX = x;
                    double currentY = y;
                    if (!sl.validate(stamp))
                      continue retryHoldingLock;
                    if (currentX != 0.0 || currentY != 0.0)
                      break;
                    stamp = sl.tryConvertToWriteLock(stamp);
                    if (stamp == 0L)
                      continue retryHoldingLock;
                    // exclusive access
                    x = newX;
                    y = newY;
                    return;
                  }
                } finally {
                  if (StampedLock.isWriteLockStamp(stamp))
                    sl.unlockWrite(stamp);
                }
              }

              // upgrade read lock to write lock
              void moveIfAtOrigin2(double newX, double newY) {
                long stamp = sl.readLock();
                try {
                  while (x == 0.0 && y == 0.0) {
                    long ws = sl.tryConvertToWriteLock(stamp);
                    if (ws != 0L) {
                      stamp = ws;
                      x = newX;
                      y = newY;
                      break;
                    }
                    else {
                      sl.unlockRead(stamp);
                      stamp = sl.writeLock();
                    }
                  }
                } finally {
                  sl.unlock(stamp);
                }
              }
            }}

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

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

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

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

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

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

StampedLock(IntPtr, JniHandleOwnership)

Инициализирует управляемое представление объекта JNI. Этот конструктор вызывается средой выполнения.

Свойства

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

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

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

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

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

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

IsWriteLocked

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

JniIdentityHashCode

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

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

Блокировка на основе возможностей с тремя режимами управления доступом на чтение и запись.

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

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

PeerReference

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

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

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

ThresholdClass

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

ThresholdType

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

Методы

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

Возвращает обычное Lock представление этого объекта StampedLock, в котором Lock#lock метод сопоставляется с #readLockдругими методами.

AsReadWriteLock()

ReadWriteLock Возвращает представление этого объекта StampedLock, в котором ReadWriteLock#readLock() метод сопоставляется с #asReadLock(), и ReadWriteLock#writeLock()#asWriteLock()с .

AsWriteLock()

Возвращает обычное Lock представление этого объекта StampedLock, в котором Lock#lock метод сопоставляется с #writeLockдругими методами.

Clone()

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

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

Блокировка на основе возможностей с тремя режимами управления доступом на чтение и запись.

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

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

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

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

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

Блокировка на основе возможностей с тремя режимами управления доступом на чтение и запись.

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

Блокировка на основе возможностей с тремя режимами управления доступом на чтение и запись.

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

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

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

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

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

Указывает, представляет ли метка удержание блокировки.

IsOptimisticReadStamp(Int64)

Указывает, представляет ли метка успешное оптимистическое чтение.

IsReadLockStamp(Int64)

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

IsWriteLockStamp(Int64)

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

JavaFinalize()

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

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

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

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

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

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

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

ReadLockInterruptibly()

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

SetHandle(IntPtr, JniHandleOwnership)

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

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

Блокировка на основе возможностей с тремя режимами управления доступом на чтение и запись.

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

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

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

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

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

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

TryConvertToReadLock(Int64)

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

TryConvertToWriteLock(Int64)

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

TryOptimisticRead()

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

TryReadLock()

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

TryReadLock(Int64, TimeUnit)

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

TryUnlockRead()

Освобождает одно удержание блокировки чтения, если оно хранится, не требуя значения метки.

TryUnlockWrite()

Освобождает блокировку записи, если она хранится, не требуя значения метки.

TryWriteLock()

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

TryWriteLock(Int64, TimeUnit)

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

Unlock(Int64)

Если состояние блокировки соответствует заданной метки, освобождает соответствующий режим блокировки.

UnlockRead(Int64)

Если состояние блокировки соответствует заданной метки, освобождает неисключательную блокировку.

UnlockWrite(Int64)

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

UnregisterFromRuntime()

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

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

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

Wait()

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

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

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

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

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

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

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

WriteLockInterruptibly()

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

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

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

Блокировка на основе возможностей с тремя режимами управления доступом на чтение и запись.

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

Блокировка на основе возможностей с тремя режимами управления доступом на чтение и запись.

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

Блокировка на основе возможностей с тремя режимами управления доступом на чтение и запись.

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

Блокировка на основе возможностей с тремя режимами управления доступом на чтение и запись.

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

Блокировка на основе возможностей с тремя режимами управления доступом на чтение и запись.

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

Блокировка на основе возможностей с тремя режимами управления доступом на чтение и запись.

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

Блокировка на основе возможностей с тремя режимами управления доступом на чтение и запись.

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

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

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

JavaAs<TResult>(IJavaPeerable)

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

JavaCast<TResult>(IJavaObject)

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

JavaCast<TResult>(IJavaObject)

Блокировка на основе возможностей с тремя режимами управления доступом на чтение и запись.

TryJavaCast<TResult>(IJavaPeerable, TResult)

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

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