Spec-Zone .ru
спецификации, руководства, описания, API
|
public class StampedLock extends Object implements Serializable
writeLock()
возможно блоки, ожидающие эксклюзивного доступа, возвращая штамп, который может использоваться в методе unlockWrite(long)
выпускать блокировку. Несинхронизированные и синхронизированные версии tryWriteLock
также обеспечиваются. Когда блокировка сохранена в режиме записи, никакие блокировки чтения не могут быть получены, и все оптимистические проверки допустимости чтения перестанут работать. readLock()
возможно блоки, ожидающие неэксклюзивного доступа, возвращая штамп, который может использоваться в методе unlockRead(long)
выпускать блокировку. Несинхронизированные и синхронизированные версии tryReadLock
также обеспечиваются. tryOptimisticRead()
возвращает ненулевой штамп, только если блокировка в настоящий момент не сохранена в режиме записи. Метод validate(long)
возвращает true, если блокировка не была получена в режиме записи начиная с получения данного штампа. Этот режим может считаться чрезвычайно слабой версией блокировки чтения, которая может быть повреждена писателем в любое время. Использование оптимистического режима для коротких сегментов кода только для чтения часто уменьшает конкуренцию и улучшает пропускную способность. Однако, его использование по сути хрупко. Оптимистические разделы чтения должны только считать поля и содержать их в локальных переменных для более позднего использования после проверки допустимости. Поля читают, в то время как в оптимистическом режиме может быть дико непоследовательным, таким образом, использование применяется только, когда Вы достаточно знакомы с представлениями данных, чтобы проверить непротиворечивость и/или неоднократно вызывать метод validate()
. Например, такие шаги обычно требуются, когда первое чтение объект или выстраивает ссылку, и затем доступ к одному из его полей, элементов или методов. Этот class также поддерживает методы, которые условно обеспечивают преобразования через эти три режима. Например, метод tryConvertToWriteLock(long)
попытки "обновить" режим, уже возвращая допустимый штамп записи, если (1) в записи режима (2) в чтении режима и нет никаких других читателей или (3) в оптимистическом режиме и блокировке, доступны. Формы этих методов разрабатываются, чтобы помочь уменьшить часть чрезмерного увеличения размера кода, которое иначе происходит в основанных на повторной попытке проектах.
StampedLocks разрабатываются для использования в качестве внутренних утилит в разработке ориентированных на многопотоковое исполнение компонентов. Их использование полагается на знание внутренних свойств данных, объектов, и методов, которые они защищают. Они не повторно используемы, таким образом, заблокированные тела не должны вызвать другие неизвестные методы, которые могут попытаться повторно получить блокировки (хотя можно передать штамп к другим методам, которые могут использовать или преобразовать его). Использование режимов блокировки чтения полагается на связанные разделы кода, являющиеся без побочных эффектов. Непроверенные оптимистические разделы чтения не могут вызвать методы, которые, как известно, не терпят потенциальные несогласованности. Штампы используют конечные представления, и не криптографически безопасны (то есть, допустимый штамп может быть отгадываемым). Значения штампа могут переработать после (только чем) один год непрерывной работы. Штамп, сохраненный без использования или проверки допустимости для дольше чем этот период, может быть не в состоянии проверить правильно. StampedLocks сериализуемы, но всегда десериализовывают в начальную букву разблокированное состояние, таким образом, они не полезны для удаленной блокировки.
Политика планирования StampedLock последовательно не предпочитает читателей по писателям или наоборот. Все методы "попытки" являются максимальными усилиями и не обязательно соответствуют любому планированию или политике справедливости. Нулевой возврат из любого метода "попытки" для получения или преобразования блокировок не переносит информации о состоянии блокировки; последующий вызов может успешно выполниться.
Поскольку это поддерживает скоординированное использование через многократные режимы блокировки, этот class непосредственно не реализует Lock
или ReadWriteLock
интерфейсы. Однако, StampedLock может быть просмотрен asReadLock()
, asWriteLock()
, или asReadWriteLock()
в приложениях, требующих только связанного набора функциональности.
Демонстрационное Использование. Следующее иллюстрирует некоторые идиомы использования в class, который поддерживает простые двумерные точки. Пример кода иллюстрирует некоторые соглашения попытки/выгоды даже при том, что они не строго необходимы здесь, потому что никакие исключения не могут произойти в телах.
class Point {
private double x, y;
private final StampedLock sl = new StampedLock();
void move(double deltaX, double deltaY) { // an exclusively locked method
long stamp = sl.writeLock();
try {
x += deltaX;
y += deltaY;
} finally {
sl.unlockWrite(stamp);
}
}
double distanceFromOrigin() { // A read-only method
long stamp = sl.tryOptimisticRead();
double currentX = x, currentY = y;
if (!sl.validate(stamp)) {
stamp = sl.readLock();
try {
currentX = x;
currentY = y;
} finally {
sl.unlockRead(stamp);
}
}
return Math.sqrt(currentX * currentX + currentY * currentY);
}
void moveIfAtOrigin(double newX, double newY) { // upgrade
// Could instead start with optimistic, not read mode
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);
}
}
}
Конструктор и Описание |
---|
StampedLock()
Создает новую блокировку, первоначально в разблокированном состоянии.
|
Модификатор и Тип | Метод и Описание |
---|---|
Блокировка |
asReadLock()
Возвращает плоскость
Lock представление то, этого StampedLock, в который Lock.lock() метод отображается на readLock() , и так же для других методов. |
ReadWriteLock |
asReadWriteLock()
Возвраты a
ReadWriteLock представление то, этого StampedLock, в который ReadWriteLock.readLock() метод отображается на asReadLock() , и ReadWriteLock.writeLock() к asWriteLock() . |
Блокировка |
asWriteLock()
Возвращает плоскость
Lock представление то, этого StampedLock, в который Lock.lock() метод отображается на writeLock() , и так же для других методов. |
int |
getReadLockCount()
Запрашивает число блокировок чтения, сохраненных для этой блокировки.
|
boolean |
isReadLocked()
Возвращает true, если блокировка в настоящий момент сохранена неисключительно.
|
boolean |
isWriteLocked()
Возвращает true, если блокировка в настоящий момент сохранена исключительно.
|
long |
readLock()
Неисключительно получает блокировку, блокируя в случае необходимости до доступный.
|
long |
readLockInterruptibly()
Неисключительно получает блокировку, блокируя в случае необходимости до доступный, или текущий поток прерывается.
|
Строка |
toString()
Возвращает строку, идентифицирующую эту блокировку, так же как ее состояние блокировки.
|
long |
tryConvertToOptimisticRead(long stamp)
Если состояние блокировки соответствует данный штамп тогда, если штамп представляет содержание блокировки, выпускает его и возвращает штамп наблюдения.
|
long |
tryConvertToReadLock(long stamp)
Если состояние блокировки соответствует данный штамп, выполняет одно из следующих действий.
|
long |
tryConvertToWriteLock(long stamp)
Если состояние блокировки соответствует данный штамп, выполняет одно из следующих действий.
|
long |
tryOptimisticRead()
Возвращает штамп, который может позже быть проверен, или нуль если исключительно блокирующийся.
|
long |
tryReadLock()
Неисключительно получает блокировку, если это сразу доступно.
|
long |
tryReadLock(long time, TimeUnit unit)
Неисключительно получает блокировку, если это доступно в пределах данного времени, и текущий поток не был прерван.
|
boolean |
tryUnlockRead()
Выпуски, которые каждый содержит блокировки чтения, если она сохранена, не требуя значения штампа.
|
boolean |
tryUnlockWrite()
Выпускает блокировку записи, если она сохранена, не требуя значения штампа.
|
long |
tryWriteLock()
Исключительно получает блокировку, если это сразу доступно.
|
long |
tryWriteLock(long time, TimeUnit unit)
Исключительно получает блокировку, если это доступно в пределах данного времени, и текущий поток не был прерван.
|
void |
unlock(long stamp)
Если состояние блокировки соответствует данный штамп, выпускает соответствующий режим блокировки.
|
void |
unlockRead(long stamp)
Если состояние блокировки соответствует данный штамп, выпускает неисключительную блокировку.
|
void |
unlockWrite(long stamp)
Если состояние блокировки соответствует данный штамп, выпускает монопольную блокировку.
|
boolean |
validate(long stamp)
Возвращает true, если блокировка не была исключительно получена начиная с выпуска данного штампа.
|
long |
writeLock()
Исключительно получает блокировку, блокируя в случае необходимости до доступный.
|
long |
writeLockInterruptibly()
Исключительно получает блокировку, блокируя в случае необходимости до доступный, или текущий поток прерывается.
|
public StampedLock()
public long writeLock()
public long tryWriteLock()
public long tryWriteLock(long time, TimeUnit unit) throws InterruptedException
Lock.tryLock(long,TimeUnit)
.InterruptedException
- если текущий поток прерывается прежде, чем получить блокировкуpublic long writeLockInterruptibly() throws InterruptedException
Lock.lockInterruptibly()
.InterruptedException
- если текущий поток прерывается прежде, чем получить блокировкуpublic long readLock()
public long tryReadLock()
public long tryReadLock(long time, TimeUnit unit) throws InterruptedException
Lock.tryLock(long,TimeUnit)
.InterruptedException
- если текущий поток прерывается прежде, чем получить блокировкуpublic long readLockInterruptibly() throws InterruptedException
Lock.lockInterruptibly()
.InterruptedException
- если текущий поток прерывается прежде, чем получить блокировкуpublic long tryOptimisticRead()
public boolean validate(long stamp)
tryOptimisticRead()
или метод блокировки для этой блокировки не имеет никакого определенного эффекта или результата.public void unlockWrite(long stamp)
stamp
- штамп возвратился работой блокировки записиIllegalMonitorStateException
- если штамп не соответствует текущее состояние этой блокировкиpublic void unlockRead(long stamp)
stamp
- штамп возвратился работой блокировки чтенияIllegalMonitorStateException
- если штамп не соответствует текущее состояние этой блокировкиpublic void unlock(long stamp)
stamp
- штамп возвратился работой блокировкиIllegalMonitorStateException
- если штамп не соответствует текущее состояние этой блокировкиpublic long tryConvertToWriteLock(long stamp)
stamp
- штампpublic long tryConvertToReadLock(long stamp)
stamp
- штампpublic long tryConvertToOptimisticRead(long stamp)
stamp
- штампpublic boolean tryUnlockWrite()
public boolean tryUnlockRead()
public boolean isWriteLocked()
public boolean isReadLocked()
public int getReadLockCount()
public String toString()
"Unlocked"
или Строка "Write-locked"
или Строка "Read-locks:"
сопровождаемый текущим числом блокировок чтения сохранен.public Lock asReadLock()
Lock
представление то, этого StampedLock, в который Lock.lock()
метод отображается на readLock()
, и так же для других методов. Возвращенная Блокировка не поддерживает a Condition
; метод Lock.newCondition()
броски UnsupportedOperationException
.public Lock asWriteLock()
Lock
представление то, этого StampedLock, в который Lock.lock()
метод отображается на writeLock()
, и так же для других методов. Возвращенная Блокировка не поддерживает a Condition
; метод Lock.newCondition()
броски UnsupportedOperationException
.public ReadWriteLock asReadWriteLock()
ReadWriteLock
представление то, этого StampedLock, в который ReadWriteLock.readLock()
метод отображается на asReadLock()
, и ReadWriteLock.writeLock()
к asWriteLock()
.
Для дальнейшей ссылки API и документации разработчика, см. Java Документация SE. Та документация содержит более подробные, предназначенные разработчиком описания, с концептуальными краткими обзорами, определениями сроков, обходных решений, и рабочих примеров кода.
Авторское право © 1993, 2013, Oracle и/или его филиалы. Все права защищены.
Проект сборка-b92