Класс AbstractQueuedSynchronizer
- java.lang.Object
-
- java.util.concurrent.locks.AbstractOwnableSynchronizer
-
- java.util.concurrent.locks.AbstractQueuedSynchronizer
- Все реализованные интерфейсы:
- Serializable
public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer implements Serializable
Предоставляет фреймворк для реализации блокирующих замков и связанных синхронизаторов (семафоры, события и т. д.), которые полагаются на очереди ожидания «первым пришёл — первым обслужен» (FIFO). Этот класс предназначен для использования в качестве полезной основы для большинства видов синхронизаторов, которые полагаются на единственное атомарное int значение для представления состояния. Подклассы должны определить защищённые методы, которые изменяют это состояние и которые определяют, что это состояние означает в отношении приобретения или освобождения этого объекта. Учитывая это, другие методы в этом классе выполняют все механизмы очереди и блокировки. Подклассы могут сохранять другие поля состояния, но только атомарно обновлённое int значение, обрабатываемое методами getState(), setState(int) и compareAndSetState(int, int), отслеживается в отношении синхронизации.
Подклассы должны быть определены как внутренние вспомогательные классы, которые используются для реализации свойств синхронизации их содержащего класса. Класс AbstractQueuedSynchronizer не реализует ни одного интерфейса синхронизации. Вместо этого он определяет методы, такие как acquireInterruptibly(int), которые могут вызываться соответствующим образом конкретными замками и связанными синхронизаторами для реализации их публичных методов.
Этот класс поддерживает либо режим по умолчанию исключительный, либо режим совместный. При приобретении в режиме эксклюзивного доступа попытки приобретения другими потоками не могут быть успешными. При приобретении в режиме совместного доступа несколькими потоками приобретение может (но не обязательно) быть успешным. Этот класс не «понимает» этих различий, за исключением механического аспекта, заключающегося в том, что когда приобретение в режиме совместного доступа оказывается успешным, следующий ждущий поток (если он есть) также должен определить, может ли он также приобрести. Потоки, ожидающие в различных режимах, используют общую очередь FIFO. Обычно подклассы реализации поддерживают только один из этих режимов, но оба могут участвовать, например, в ReadWriteLock. Подклассы, которые поддерживают только эксклюзивный или только совместный режимы, не обязаны определять методы, поддерживающие неиспользуемый режим.
Этот класс определяет вложенный класс AbstractQueuedSynchronizer.ConditionObject, который может использоваться в качестве реализации Condition подклассами, поддерживающими эксклюзивный режим, для которого метод isHeldExclusively() сообщает, захвачена ли синхронизация исключительно текущим потоком, метод release(int), вызванный с текущим значением getState(), полностью освобождает этот объект, и acquire(int), учитывая это сохранённое значение состояния, в конечном итоге восстанавливает этот объект в его предыдущее состояние приобретения. Ни один AbstractQueuedSynchronizer метод иначе не создаёт такое условие, поэтому если это ограничение невозможно выполнить, не используйте его. Поведение AbstractQueuedSynchronizer.ConditionObject, конечно, зависит от семантики реализации его синхронизатора.
Этот класс предоставляет методы проверки, инструментации и мониторинга для внутренней очереди, а также аналогичные методы для объектов условия. Эти методы могут быть экспортированы по желанию в классы, использующие AbstractQueuedSynchronizer для своих механизмов синхронизации.
Сериализация этого класса сохраняет только лежащий в основе атомарный целочисленный тип, поддерживающий состояние, поэтому десериализованные объекты имеют пустые очереди потоков. Типичные подклассы, требующие сериализуемости, определяют метод readObject , который восстанавливает это в известное начальное состояние при десериализации.
Использование
Для использования этого класса в качестве основы синхронизатора переопределите следующие методы, применимые к ситуации, проверяя и/или изменяя состояние синхронизации с использованием getState(), setState(int) и/или compareAndSetState(int, int):
UnsupportedOperationException. Реализации этих методов должны быть внутренне потокобезопасными и, как правило, должны быть короткими и не блокирующими. Определение этих методов является единственным поддерживаемым способом использования этого класса. Все остальные методы объявлены final , так как они не могут быть независимо изменены. Вы также можете найти полезными унаследованные методы из AbstractOwnableSynchronizer для отслеживания потока, владеющего эксклюзивным синхронизатором. Рекомендуется их использовать — это позволяет инструментам мониторинга и диагностики помочь пользователям определить, какие потоки владеют замками.
Несмотря на то, что этот класс основан на внутренней очереди FIFO, он не автоматически навязывает политики приобретения FIFO. Ядро эксклюзивной синхронизации имеет вид:
Acquire:
while (!tryAcquire(arg)) {
enqueue thread if it is not already queued;
possibly block current thread;
}
Release:
if (tryRelease(arg))
unblock the first queued thread; (Режим совместного доступа аналогичен, но может включать каскадные сигналы.) Поскольку проверки в acquire вызываются до помещения в очередь, новый приобретающий поток может продвинуться вперёд перед другими потоками, которые заблокированы и находятся в очереди. Однако при желании вы можете определить tryAcquire и/или tryAcquireShared для отключения продвижения вперёд, вызвав внутренне один или несколько методов проверки, тем самым обеспечив честную политику приобретения FIFO. В частности, большинство честных синхронизаторов могут определить tryAcquire , чтобы вернуть false , если hasQueuedPredecessors() (метод, специально разработанный для использования честными синхронизаторами) возвращает true. Возможны и другие варианты.
Производительность и масштабируемость обычно максимальны для стратегии продвижения вперёд по умолчанию (также известной как жадная, отказная и избегающая конвоя) стратегия. Хотя это не гарантирует справедливости или отсутствия голодания, потоки, помещённые в очередь раньше, разрешается повторно претендовать на ресурс перед потоками, помещёнными в очередь позже, и каждая повторная попытка имеет беспристрастный шанс преуспеть против входящих потоков. Кроме того, хотя приобретения не «вращаются» в обычном смысле, они могут выполнить несколько вызовов tryAcquire , перемежаемых другими вычислениями, прежде чем заблокироваться. Это даёт большинство преимуществ вращений, когда эксклюзивная синхронизация удерживается только на короткий срок, без большей части недостатков, когда это не так. При необходимости вы можете дополнить это, добавив перед вызовами методов acquire проверки «быстрого пути», возможно, предварительно проверив hasContended() и/или hasQueuedThreads() для выполнения этого только в том случае, если синхронизатор, вероятно, не будет оспариваться.
Этот класс предоставляет эффективную и масштабируемую основу для синхронизации, отчасти специализируясь на синхронизаторах, которые могут полагаться на int состояние, параметры приобретения и освобождения, а также внутреннюю очередь ожидания FIFO. Когда этого недостаточно, вы можете создавать синхронизаторы на более низком уровне, используя классы atomic, свои собственные пользовательские классы Queue и поддержку блокировки LockSupport.
Примеры использования
Вот класс нерекурсивной взаимной блокировки, который использует значение ноль для представления разблокированного состояния и единицу для представления заблокированного состояния. Хотя для нерекурсивного замка строго не требуется регистрация текущего владельца потока, этот класс делает это для упрощения мониторинга использования. Он также поддерживает условия и раскрывает один из методов инструментации:
class Mutex implements Lock, java.io.Serializable {
// Our internal helper class
private static class Sync extends AbstractQueuedSynchronizer {
// Reports whether in locked state
protected boolean isHeldExclusively() {
return getState() == 1;
}
// Acquires the lock if state is zero
public boolean tryAcquire(int acquires) {
assert acquires == 1; // Otherwise unused
if (compareAndSetState(0, 1)) {
setExclusiveOwnerThread(Thread.currentThread());
return true;
}
return false;
}
// Releases the lock by setting state to zero
protected boolean tryRelease(int releases) {
assert releases == 1; // Otherwise unused
if (getState() == 0) throw new IllegalMonitorStateException();
setExclusiveOwnerThread(null);
setState(0);
return true;
}
// Provides a Condition
Condition newCondition() { return new ConditionObject(); }
// Deserializes properly
private void readObject(ObjectInputStream s)
throws IOException, ClassNotFoundException {
s.defaultReadObject();
setState(0); // reset to unlocked state
}
}
// The sync object does all the hard work. We just forward to it.
private final Sync sync = new Sync();
public void lock() { sync.acquire(1); }
public boolean tryLock() { return sync.tryAcquire(1); }
public void unlock() { sync.release(1); }
public Condition newCondition() { return sync.newCondition(); }
public boolean isLocked() { return sync.isHeldExclusively(); }
public boolean hasQueuedThreads() { return sync.hasQueuedThreads(); }
public void lockInterruptibly() throws InterruptedException {
sync.acquireInterruptibly(1);
}
public boolean tryLock(long timeout, TimeUnit unit)
throws InterruptedException {
return sync.tryAcquireNanos(1, unit.toNanos(timeout));
}
} Вот класс затвора, похожий на CountDownLatch, за исключением того, что он требует только одного signal для срабатывания. Поскольку затвор не является эксклюзивным, он использует методы shared acquire и release.
class BooleanLatch {
private static class Sync extends AbstractQueuedSynchronizer {
boolean isSignalled() { return getState() != 0; }
protected int tryAcquireShared(int ignore) {
return isSignalled() ? 1 : -1;
}
protected boolean tryReleaseShared(int ignore) {
setState(1);
return true;
}
}
private final Sync sync = new Sync();
public boolean isSignalled() { return sync.isSignalled(); }
public void signal() { sync.releaseShared(1); }
public void await() throws InterruptedException {
sync.acquireSharedInterruptibly(1);
}
}
- С:
- 1.5
- См. также:
- Формат сериализации
Вложенные классы
| Модификатор и тип | Класс и описание |
|---|---|
class |
AbstractQueuedSynchronizer.ConditionObject Реализация условия для |
Краткое описание конструкторов
| Модификатор | Конструктор и описание |
|---|---|
protected |
AbstractQueuedSynchronizer() Создаёт новый экземпляр |
Краткое описание методов
| Модификатор и тип | Метод и описание |
|---|---|
void |
acquire(int arg) Приобретает в эксклюзивном режиме, игнорируя прерывания. |
void |
acquireInterruptibly(int arg) Приобретает в эксклюзивном режиме, прерывая выполнение, если произошел перерыв. |
void |
acquireShared(int arg) Приобретает в совместном режиме, игнорируя прерывания. |
void |
acquireSharedInterruptibly(int arg) Приобретает в совместном режиме, прерывая выполнение, если произошел перерыв. |
protected boolean |
compareAndSetState(int expect,
int update) Атомарно устанавливает состояние синхронизации на заданное обновлённое значение, если текущее значение состояния равно ожидаемому значению. |
Collection<Thread> |
getExclusiveQueuedThreads() Возвращает коллекцию, содержащую потоки, которые могут ожидать приобретения в эксклюзивном режиме. |
Thread |
getFirstQueuedThread() Возвращает первый (самый долго ожидающий) поток в очереди или |
Collection<Thread> |
getQueuedThreads() Возвращает коллекцию, содержащую потоки, которые могут ожидать приобретения. |
int |
getQueueLength() Возвращает оценку количества потоков, ожидающих приобретения. |
Collection<Thread> |
getSharedQueuedThreads() Возвращает коллекцию, содержащую потоки, которые могут ожидать приобретения в совместном режиме. |
protected int |
getState() Возвращает текущее значение состояния синхронизации. |
Collection<Thread> |
getWaitingThreads(AbstractQueuedSynchronizer.ConditionObject condition) Возвращает коллекцию, содержащую потоки, которые могут ожидать заданного условия, связанного с этим синхронизатором. |
int |
getWaitQueueLength(AbstractQueuedSynchronizer.ConditionObject condition) Возвращает оценку количества потоков, ожидающих заданного условия, связанного с этим синхронизатором. |
boolean |
hasContended() Определяет, сталкивались ли какие-либо потоки при попытке приобретения этого синхронизатора; то есть, блокировался ли метод acquire. |
boolean |
hasQueuedPredecessors() Определяет, ожидают ли какие-либо потоки приобретения дольше, чем текущий поток. |
boolean |
hasQueuedThreads() Определяет, ожидают ли какие-либо потоки приобретения. |
boolean |
hasWaiters(AbstractQueuedSynchronizer.ConditionObject condition) Определяет, ожидают ли какие-либо потоки заданного условия, связанного с этим синхронизатором. |
protected boolean |
isHeldExclusively() Возвращает |
boolean |
isQueued(Thread thread) Возвращает true, если данный поток в настоящее время находится в очереди. |
boolean |
owns(AbstractQueuedSynchronizer.ConditionObject condition) Определяет, использует ли заданный объект ConditionObject этот синхронизатор в качестве блокировки. |
boolean |
release(int arg) Освобождает в эксклюзивном режиме. |
boolean |
releaseShared(int arg) Освобождает в совместном режиме. |
protected void |
setState(int newState) Устанавливает значение состояния синхронизации. |
String |
toString() Возвращает строку, идентифицирующую этот синхронизатор, а также его состояние. |
protected boolean |
tryAcquire(int arg) Попытка приобрести в эксклюзивном режиме. |
boolean |
tryAcquireNanos(int arg,
long nanosTimeout) Попытка приобрести в эксклюзивном режиме, прерывая выполнение при перерыве и отказываясь, если заданный интервал времени истекает. |
protected int |
tryAcquireShared(int arg) Попытка приобрести в совместном режиме. |
boolean |
tryAcquireSharedNanos(int arg,
long nanosTimeout) Попытка приобрести в совместном режиме, прерывая выполнение при перерыве и отказываясь, если заданный интервал времени истекает. |
protected boolean |
tryRelease(int arg) Попытка установить состояние, отражающее освобождение в эксклюзивном режиме. |
protected boolean |
tryReleaseShared(int arg) Попытка установить состояние, отражающее освобождение в совместном режиме. |
Методы, унаследованные от класса java.util.concurrent.locks.AbstractOwnableSynchronizer
getExclusiveOwnerThread, setExclusiveOwnerThread Методы, унаследованные от класса java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait Конструкторы
AbstractQueuedSynchronizer
protected AbstractQueuedSynchronizer()
Создаёт новый AbstractQueuedSynchronizer экземпляр с начальным состоянием синхронизации ноль.
Методы
getState
protected final int getState()
Возвращает текущее значение состояния синхронизации. Эта операция имеет семантику памяти для volatile чтения.
- Возвращает:
- текущее значение состояния
setState
protected final void setState(int newState)
Устанавливает значение состояния синхронизации. Эта операция имеет семантику памяти для volatile записи.
- Параметры:
-
newState- новое значение состояния
compareAndSetState
protected final boolean compareAndSetState(int expect,
int update) Атомарно устанавливает состояние синхронизации на заданное обновлённое значение, если текущее значение состояния равно ожидаемому значению. Эта операция имеет семантику памяти для volatile чтения и записи.
- Параметры:
-
expect- ожидаемое значение -
update- новое значение - Возвращает:
-
trueв случае успеха. Возврат значения False указывает, что фактическое значение не было равно ожидаемому значению.
tryAcquire
protected boolean tryAcquire(int arg)
Попытка приобретения в эксклюзивном режиме. Этот метод должен запросить, позволяет ли состояние объекта приобрести его в эксклюзивном режиме, и, если да, то приобрести его.
Этот метод всегда вызывается потоком, выполняющим приобретение. Если этот метод сообщает об ошибке, метод acquire может поместить поток в очередь, если он ещё не в очереди, до тех пор, пока он не получит сигнал об освобождении от другого потока. Это может быть использовано для реализации метода Lock.tryLock().
По умолчанию реализация выбрасывает UnsupportedOperationException.
- Параметры:
-
arg- аргумент приобретения. Это значение всегда передаётся методу acquire или сохраняется при входе в ожидание условия. В противном случае значение не интерпретируется и может представлять собой что угодно. - Возвращает:
-
trueв случае успеха. При успехе, этот объект был приобретён. - Исключения:
-
IllegalMonitorStateException- если приобретение поставит этот синхронизатор в незаконное состояние. Это исключение должно выбрасываться последовательно для корректной работы синхронизации. -
UnsupportedOperationException- если эксклюзивный режим не поддерживается
tryRelease
protected boolean tryRelease(int arg)
Попытка установить состояние, отражающее освобождение в эксклюзивном режиме.
Этот метод всегда вызывается потоком, выполняющим освобождение.
По умолчанию реализация выбрасывает UnsupportedOperationException.
- Параметры:
-
arg- аргумент освобождения. Это значение всегда передаётся методу release или текущее значение состояния при входе в ожидание условия. В противном случае значение не интерпретируется и может представлять собой что угодно. - Возвращает:
-
trueесли этот объект теперь находится в полностью освобождённом состоянии, так что любые ожидающие потоки могут попытаться приобрести; иfalseв противном случае. - Исключения:
-
IllegalMonitorStateException- если освобождение поставит этот синхронизатор в незаконное состояние. Это исключение должно выбрасываться последовательно для корректной работы синхронизации. -
UnsupportedOperationException- если эксклюзивный режим не поддерживается
tryAcquireShared
protected int tryAcquireShared(int arg)
Попытка приобретения в совместном режиме. Этот метод должен запросить, позволяет ли состояние объекта приобрести его в совместном режиме, и, если да, то приобрести его.
Этот метод всегда вызывается потоком, выполняющим приобретение. Если этот метод сообщает об ошибке, метод acquire может поместить поток в очередь, если он ещё не в очереди, до тех пор, пока он не получит сигнал об освобождении от другого потока.
По умолчанию реализация выбрасывает UnsupportedOperationException.
- Параметры:
-
arg- аргумент приобретения. Это значение всегда передаётся методу acquire или сохраняется при входе в ожидание условия. В противном случае значение не интерпретируется и может представлять собой что угодно. - Возвращает:
- отрицательное значение при ошибке; ноль, если приобретение в совместном режиме прошло успешно, но последующее приобретение в совместном режиме не может пройти успешно; и положительное значение, если приобретение в совместном режиме прошло успешно и последующие приобретения в совместном режиме могут также пройти успешно, в этом случае последующий ожидающий поток должен проверить доступность. (Поддержка трёх различных возвращаемых значений позволяет использовать этот метод в контекстах, где приобретения только иногда действуют эксклюзивно.) При успехе, этот объект был приобретён.
- Исключения:
-
IllegalMonitorStateException- если приобретение поставит этот синхронизатор в незаконное состояние. Это исключение должно выбрасываться последовательно для корректной работы синхронизации. -
UnsupportedOperationException- если совместный режим не поддерживается
tryReleaseShared
protected boolean tryReleaseShared(int arg)
Попытка установить состояние, отражающее освобождение в совместном режиме.
Этот метод всегда вызывается потоком, выполняющим освобождение.
По умолчанию реализация выбрасывает UnsupportedOperationException.
- Параметры:
-
arg- аргумент освобождения. Это значение всегда передаётся методу release или текущее значение состояния при входе в ожидание условия. В противном случае значение не интерпретируется и может представлять собой что угодно. - Возвращает:
-
trueесли это освобождение совместного режима может позволить ожидающему приобретению (совместному или эксклюзивному) пройти успешно; иfalseв противном случае - Исключения:
-
IllegalMonitorStateException- если освобождение поставит этот синхронизатор в незаконное состояние. Это исключение должно выбрасываться последовательно для корректной работы синхронизации. -
UnsupportedOperationException- если совместный режим не поддерживается
isHeldExclusively
protected boolean isHeldExclusively()
Возвращает true если синхронизация удерживается эксклюзивно относительно текущего (вызывающего) потока. Этот метод вызывается при каждом вызове метода AbstractQueuedSynchronizer.ConditionObject без ожидания. (Методы ожидания вместо этого вызывают release(int).)
По умолчанию реализация выбрасывает UnsupportedOperationException. Этот метод вызывается только внутри методов AbstractQueuedSynchronizer.ConditionObject, поэтому не обязательно определять, если условия не используются.
- Возвращает:
-
trueесли синхронизация удерживается эксклюзивно;falseв противном случае - Исключения:
-
UnsupportedOperationException- если условия не поддерживаются
acquire
public final void acquire(int arg)
Приобретает в эксклюзивном режиме, игнорируя прерывания. Реализуется путём вызова по крайней мере один раз tryAcquire(int), возвращаясь при успехе. В противном случае поток ставится в очередь, возможно, многократно блокируясь и разблокируясь, вызывая tryAcquire(int) до успеха. Этот метод можно использовать для реализации метода Lock.lock().
- Параметры:
-
arg- аргумент приобретения. Это значение передаётся вtryAcquire(int), но в противном случае не интерпретируется и может представлять собой что угодно.
acquireInterruptibly
public final void acquireInterruptibly(int arg)
throws InterruptedException Приобретает в эксклюзивном режиме, прерывая, если прерван. Реализуется путём проверки статуса прерывания, затем вызова по крайней мере один раз tryAcquire(int), возвращаясь при успехе. В противном случае поток ставится в очередь, возможно, многократно блокируясь и разблокируясь, вызывая tryAcquire(int) до успеха или прерывания потока. Этот метод может быть использован для реализации метода Lock.lockInterruptibly().
- Параметры:
-
arg- аргумент приобретения. Это значение передаётся вtryAcquire(int), но в противном случае не интерпретируется и может представлять собой что угодно. - Исключения:
-
InterruptedException- если текущий поток прерван
tryAcquireNanos
public final boolean tryAcquireNanos(int arg,
long nanosTimeout)
throws InterruptedException Попытка приобретения в эксклюзивном режиме, прерывая, если прерван, и завершаясь, если истечёт заданный таймаут. Реализуется путём проверки статуса прерывания, затем вызова по крайней мере один раз tryAcquire(int), возвращаясь при успехе. В противном случае поток ставится в очередь, возможно, многократно блокируясь и разблокируясь, вызывая tryAcquire(int) до успеха или прерывания потока или истечения таймаута. Этот метод можно использовать для реализации метода Lock.tryLock(long, TimeUnit).
- Параметры:
-
arg- аргумент приобретения. Это значение передаётся вtryAcquire(int), но в противном случае не интерпретируется и может представлять собой что угодно. -
nanosTimeout- максимальное количество наносекунд для ожидания - Возвращает:
-
trueесли приобретено;falseесли истек таймаут - Исключения:
-
InterruptedException- если текущий поток прерван
release
public final boolean release(int arg)
Освобождает в эксклюзивном режиме. Реализуется разблокировкой одного или нескольких потоков, если tryRelease(int) возвращает true. Этот метод можно использовать для реализации метода Lock.unlock().
- Параметры:
-
arg- аргумент освобождения. Это значение передаётся вtryRelease(int), но в противном случае не интерпретируется и может представлять собой что угодно. - Возвращает:
- значение, возвращённое из
tryRelease(int)
acquireShared
public final void acquireShared(int arg)
Приобретает в режиме совместного использования, игнорируя прерывания. Реализовано путём вызова по крайней мере один раз tryAcquireShared(int), возвращая результат при успехе. В противном случае поток помещается в очередь, возможно, многократно блокируясь и разблокируясь, вызывая tryAcquireShared(int) до достижения успеха.
- Параметры:
-
arg- аргумент приобретения. Это значение передаётся вtryAcquireShared(int), но в остальном не интерпретируется и может представлять собой что угодно.
acquireSharedInterruptibly
public final void acquireSharedInterruptibly(int arg)
throws InterruptedException Приобретает в режиме совместного использования, прерывая выполнение, если поток прерван. Реализовано путём проверки состояния прерывания, а затем вызова по крайней мере один раз tryAcquireShared(int), возвращая результат при успехе. В противном случае поток помещается в очередь, возможно, многократно блокируясь и разблокируясь, вызывая tryAcquireShared(int) до достижения успеха или прерывания потока.
- Параметры:
-
arg- аргумент приобретения. Это значение передаётся вtryAcquireShared(int), но в остальном не интерпретируется и может представлять собой что угодно. - Исключения:
-
InterruptedException- если текущий поток прерван
tryAcquireSharedNanos
public final boolean tryAcquireSharedNanos(int arg,
long nanosTimeout)
throws InterruptedException Попытка приобретения в режиме совместного использования, прерывание, если поток прерван, и отказ, если заданный интервал времени истечёт. Реализовано путём проверки состояния прерывания, а затем вызова по крайней мере один раз tryAcquireShared(int), возвращая результат при успехе. В противном случае поток помещается в очередь, возможно, многократно блокируясь и разблокируясь, вызывая tryAcquireShared(int) до достижения успеха, прерывания потока или истечения срока ожидания.
- Параметры:
-
arg- аргумент приобретения. Это значение передаётся вtryAcquireShared(int), но в остальном не интерпретируется и может представлять собой что угодно. -
nanosTimeout- максимальное количество наносекунд ожидания - Возвращает:
-
trueесли приобретено;falseесли истекло время ожидания - Исключения:
-
InterruptedException- если текущий поток прерван
releaseShared
public final boolean releaseShared(int arg)
Освобождает в режиме совместного использования. Реализовано путём разблокировки одного или нескольких потоков, если tryReleaseShared(int) возвращает true.
- Параметры:
-
arg- аргумент освобождения. Это значение передаётся вtryReleaseShared(int), но в остальном не интерпретируется и может представлять собой что угодно. - Возвращает:
- значение, возвращённое из
tryReleaseShared(int)
hasQueuedThreads
public final boolean hasQueuedThreads()
Определяет, ожидают ли какие-либо потоки приобретения. Обратите внимание, что из-за отмены из-за прерываний и таймаутов в любое время возврат true не гарантирует, что какой-либо другой поток когда-либо приобретёт.
В этой реализации эта операция выполняется за константное время.
- Возвращает:
-
trueесли могут ожидать другие потоки
hasContended
public final boolean hasContended()
Определяет, конкурировали ли какие-либо потоки за приобретение этого синхронизатора; то есть, блокировался ли какой-либо метод приобретения.
В этой реализации эта операция выполняется за константное время.
- Возвращает:
-
trueесли когда-либо была конкуренция
getFirstQueuedThread
public final Thread getFirstQueuedThread()
Возвращает первый (самый долго ожидающий) поток в очереди или null , если в настоящее время в очереди нет потоков.
В этой реализации эта операция обычно выполняется за постоянное время, но может выполняться итерация при конкуренции, если другие потоки одновременно изменяют очередь.
- Возвращает:
- первый (самый долго ожидающий) поток в очереди или
null, если в настоящее время в очереди нет потоков
isQueued
public final boolean isQueued(Thread thread)
Возвращает true, если данный поток в настоящее время находится в очереди.
Эта реализация перебирает очередь, чтобы определить наличие данного потока.
- Параметры:
-
thread- поток - Возвращает:
-
trueесли данный поток находится в очереди - Исключения:
-
NullPointerException- если поток равен null
hasQueuedPredecessors
public final boolean hasQueuedPredecessors()
Определяет, ожидали ли какие-либо потоки приобретения дольше, чем текущий поток.
Вызов этого метода эквивалентен (но может быть более эффективным):
getFirstQueuedThread() != Thread.currentThread() && hasQueuedThreads()
Обратите внимание, что из-за отмены из-за прерываний и таймаутов в любое время возврат true не гарантирует, что какой-либо другой поток приобретёт прежде текущего. Также возможно, что другой поток выиграет гонку по добавлению в очередь после того, как этот метод вернул false, из-за того, что очередь пуста.
Этот метод разработан для использования честным синхронизатором для избежания перебивания. Метод tryAcquire(int) такого синхронизатора должен возвращать false, а метод tryAcquireShared(int) должен возвращать отрицательное значение, если этот метод возвращает true (если это не повторное приобретение). Например, метод tryAcquire для честного, повторного, синхронизатора в режиме исключения может выглядеть так:
protected boolean tryAcquire(int arg) {
if (isHeldExclusively()) {
// A reentrant acquire; increment hold count
return true;
} else if (hasQueuedPredecessors()) {
return false;
} else {
// try to acquire normally
}
}
- Возвращает:
-
trueесли в очереди есть поток, предшествующий текущему потоку, иfalseесли текущий поток находится в голове очереди или очередь пуста - С:
- 1.7
getQueueLength
public final int getQueueLength()
Возвращает оценку количества потоков, ожидающих приобретения. Значение является только оценкой, потому что количество потоков может динамически изменяться во время обхода внутренних структур данных. Этот метод предназначен для использования при мониторинге состояния системы, а не для управления синхронизацией.
- Возвращает:
- оценка количества потоков, ожидающих приобретения
getQueuedThreads
public final Collection<Thread> getQueuedThreads()
Возвращает коллекцию, содержащую потоки, которые могут ожидать приобретения. Поскольку фактический набор потоков может динамически изменяться во время построения этого результата, возвращаемая коллекция является только приблизительной оценкой. Элементы возвращаемой коллекции не упорядочены особым образом. Этот метод предназначен для облегчения создания подклассов, которые предоставляют более расширенные средства мониторинга.
- Возвращает:
- коллекция потоков
getExclusiveQueuedThreads
public final Collection<Thread> getExclusiveQueuedThreads()
Возвращает коллекцию, содержащую потоки, которые могут ожидать приобретения в режиме исключительного использования. Это имеет те же свойства, что и getQueuedThreads(), за исключением того, что она возвращает только те потоки, которые ожидают из-за исключительного приобретения.
- Возвращает:
- коллекция потоков
getSharedQueuedThreads
public final Collection<Thread> getSharedQueuedThreads()
Возвращает коллекцию, содержащую потоки, которые могут ожидать приобретения в режиме совместного использования. Это имеет те же свойства, что и getQueuedThreads(), за исключением того, что она возвращает только те потоки, которые ожидают из-за совместного приобретения.
- Возвращает:
- коллекция потоков
toString
public String toString()
Возвращает строку, идентифицирующую этот синхронизатор, а также его состояние. Состояние, в скобках, включает строку "State =" и текущее значение getState(), а также "nonempty" или "empty" в зависимости от того, пуста ли очередь.
- Переопределяет:
-
toStringв классеObject - Возвращает:
- строка, идентифицирующая этот синхронизатор, а также его состояние
owns
public final boolean owns(AbstractQueuedSynchronizer.ConditionObject condition)
Определяет, использует ли данный ConditionObject этот синхронизатор в качестве своей блокировки.
- Параметры:
-
condition- условие - Возвращает:
-
trueесли принадлежит - Исключения:
-
NullPointerException- если условие равно null
hasWaiters
public final boolean hasWaiters(AbstractQueuedSynchronizer.ConditionObject condition)
Определяет, ожидают ли какие-либо потоки на данном условии, связанном с этим синхронизатором. Обратите внимание, что из-за таймаутов и прерываний в любое время возврат true не гарантирует, что будущий signal разбудит какие-либо потоки. Этот метод предназначен в основном для мониторинга состояния системы.
- Параметры:
-
condition- условие - Возвращает:
-
trueесли есть ожидающие потоки - Исключения:
-
IllegalMonitorStateException- если исключительная синхронизация не удерживается -
IllegalArgumentException- если данное условие не связано с этим синхронизатором -
NullPointerException- если условие равно null
getWaitQueueLength
public final int getWaitQueueLength(AbstractQueuedSynchronizer.ConditionObject condition)
Возвращает оценку количества потоков, ожидающих на заданном условии, связанном с этим синхронизатором. Обратите внимание, что из-за таймаутов и прерываний в любое время оценка служит только верхней границей фактического количества ожидающих. Этот метод предназначен для использования при мониторинге состояния системы, а не для управления синхронизацией.
- Параметры:
-
condition- условие - Возвращает:
- оценка количества ожидающих потоков
- Исключения:
-
IllegalMonitorStateException- если исключительная синхронизация не удерживается -
IllegalArgumentException- если заданное условие не связано с этим синхронизатором -
NullPointerException- если условие равно null
getWaitingThreads
public final Collection<Thread> getWaitingThreads(AbstractQueuedSynchronizer.ConditionObject condition)
Возвращает коллекцию, содержащую потоки, которые могут ожидать на заданном условии, связанном с этим синхронизатором. Поскольку фактический набор потоков может динамически изменяться во время построения этого результата, возвращаемая коллекция является лишь приблизительной оценкой. Элементы возвращаемой коллекции не упорядочены каким-либо определенным образом.
- Параметры:
-
condition- условие - Возвращает:
- коллекцию потоков
- Исключения:
-
IllegalMonitorStateException- если эксклюзивная синхронизация не удерживается -
IllegalArgumentException- если заданное условие не связано с этим синхронизатором -
NullPointerException- если условие равно null
© 1993, 2020, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.