Поделиться через


StampedLock Класс

Определение

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

[Android.Runtime.Register("java/util/concurrent/locks/StampedLock", ApiSince=24, DoNotGenerateAcw=true)]
public class StampedLock : Java.Lang.Object, IDisposable, Java.Interop.IJavaPeerable, 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 состоит из версии и режима. Методы приобретения блокировки возвращают метку, представляющую и контролирующую доступ к состоянию блокировки; Версии этих методов могут вместо этого возвращать специальное значение нулю, представляющее ошибку получения доступа. Методы выпуска блокировки и преобразования требуют меток в качестве аргументов и завершаются ошибкой, если они не соответствуют состоянию блокировки. Три режима:

<ul>

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

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

<li><b>Оптимистическое чтение.<Метод #tryOptimisticRead /b> возвращает метку без нуля, только если блокировка в настоящее время не хранится в режиме записи. Метод #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.

Части этой страницы — это изменения на основе работы, созданной и общей проектом с открытым исходным кодом Android и используемой в соответствии с условиями, описанными в лицензии Creative Commons 2.5 Attribution.

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

StampedLock()

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

StampedLock(IntPtr, JniHandleOwnership)

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

Свойства

Class

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

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

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

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

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

IsWriteLocked

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

JniIdentityHashCode

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

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

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

PeerReference

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

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

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

ThresholdClass

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

ThresholdType

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

Методы

AsReadLock()

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

AsReadWriteLock()

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

AsWriteLock()

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

Clone()

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

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

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

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

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

(Унаследовано от Object)
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)
ToArray<T>()

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

(Унаследовано от 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()

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

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

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

Wait()

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

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

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

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

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

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

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

WriteLockInterruptibly()

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

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

IJavaPeerable.Disposed()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

JavaCast<TResult>(IJavaObject)

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

JavaCast<TResult>(IJavaObject)

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

GetJniTypeName(IJavaPeerable)

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

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