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 состоит из версии и режима. Методы получения блокировки возвращают метку, которая представляет и управляет доступом в отношении состояния блокировки; Версии "try" этих методов могут вместо этого возвращать специальное нулевое значение, указывающее на сбой при получении доступа. Методы освобождения блокировки и преобразования требуют меток в качестве аргументов и завершаются ошибкой, если они не соответствуют состоянию блокировки. К этим типам относятся:

<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) в режиме оптимистического чтения и блокировка доступна. Формы этих методов предназначены для уменьшения некоторых раздутий кода, которые в противном случае возникают в проектах на основе повторных попыток.

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

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

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

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

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

<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.

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

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

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>, <>прерывания< или> em, либо до истечения определенного количества реального времени.

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

Заставляет текущий поток ждать, пока он не будет пробужден, как правило, из-за <уведомления</>em>, <>прерывания< или> 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)

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

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