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 состоит из версии и режима. Методы приобретения блокировки возвращают метку, представляющую и контролирующую доступ к состоянию блокировки; Версии этих методов могут вместо этого возвращать специальное значение нулю, представляющее ошибку получения доступа. Методы выпуска блокировки и преобразования требуют меток в качестве аргументов и завершаются ошибкой, если они не соответствуют состоянию блокировки. Три режима:
<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 |
Возвращает класс среды выполнения этого |
Handle |
Дескриптор базового экземпляра Android. (Унаследовано от Object) |
IsReadLocked |
Возвращает, |
IsWriteLocked |
Возвращает, |
JniIdentityHashCode |
Блокировка на основе возможностей с тремя режимами управления доступом на чтение и запись. (Унаследовано от Object) |
JniPeerMembers |
Блокировка на основе возможностей с тремя режимами управления доступом на чтение и запись. |
PeerReference |
Блокировка на основе возможностей с тремя режимами управления доступом на чтение и запись. (Унаследовано от Object) |
ReadLockCount |
Запрашивает количество блокировок чтения, удерживаемых для этой блокировки. |
ThresholdClass |
Блокировка на основе возможностей с тремя режимами управления доступом на чтение и запись. |
ThresholdType |
Блокировка на основе возможностей с тремя режимами управления доступом на чтение и запись. |
Методы
AsReadLock() |
Возвращает обычное |
AsReadWriteLock() |
|
AsWriteLock() |
Возвращает обычное |
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) |
Блокировка на основе возможностей с тремя режимами управления доступом на чтение и запись. |