Класс 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 между другими вычислениями перед блокировкой. Это даёт большинство преимуществ вращений, когда исключительная синхронизация удерживается только на короткое время, без большинства недостатков, когда этого нет. При желании вы можете дополнить это, предваряя вызовы методов приобретения «проверками быстрого пути», возможно, предварительно проверяя hasContended() и/или hasQueuedThreads(), чтобы делать это только в том случае, если синхронизатор, вероятно, не будет конкурировать.
Этот класс обеспечивает эффективную и масштабируемую основу для синхронизации, отчасти специализируясь на синхронизаторах, которые могут полагаться на int состояние, параметры приобретения и освобождения, и внутреннюю очередь ожидания FIFO. Когда этого недостаточно, вы можете создавать синхронизаторы на более низком уровне, используя классы atomic, собственные пользовательские классы очереди Queue и поддержку блокировки LockSupport.
Примеры использования
Вот класс нерекурсивного взаимного исключения, который использует значение ноль для представления разблокированного состояния и единицу для представления заблокированного состояния. Хотя для нерекурсивного замка строго не требуется регистрация текущего владельца потока, этот класс делает это для упрощения мониторинга использования. Он также поддерживает условия и предоставляет некоторые методы инструментирования:
class Mutex implements Lock, java.io.Serializable {
// Our internal helper class
private static class Sync extends AbstractQueuedSynchronizer {
// 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 (!isHeldExclusively())
throw new IllegalMonitorStateException();
setExclusiveOwnerThread(null);
setState(0);
return true;
}
// Reports whether in locked state
public boolean isLocked() {
return getState() != 0;
}
public boolean isHeldExclusively() {
// a data race, but safe due to out-of-thin-air guarantees
return getExclusiveOwnerThread() == Thread.currentThread();
}
// Provides a Condition
public 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.isLocked(); }
public boolean isHeldByCurrentThread() {
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.
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() | Запрашивает, сталкивались ли когда-либо потоки при приобретении этого синхронизатора; то есть, блокировался ли когда-либо метод приобретения. |
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)
Попытка получения в режиме эксклюзивного доступа. Этот метод должен проверить, позволяет ли состояние объекта получить его в режиме эксклюзивного доступа, и, если да, получить его.
Этот метод всегда вызывается потоком, выполняющим приобретение. Если этот метод сообщает об ошибке, метод приобретения может поместить поток в очередь, если он еще не в очереди, до тех пор, пока он не будет сигнализирован освобождением из другого потока. Это можно использовать для реализации метода Lock.tryLock().
Реализация по умолчанию выбрасывает UnsupportedOperationException.
- Параметры:
-
arg- аргумент приобретения. Это значение всегда передается методу приобретения или сохраняется при входе в ожидание условия. Значение в противном случае не интерпретируется и может представлять собой что угодно. - Возвращает:
-
trueв случае успеха. При успехе этот объект приобретен. - Исключения:
-
IllegalMonitorStateException- если приобретение приведет этот синхронизатор в незаконное состояние. Это исключение должно выбрасываться согласованным образом для корректной работы синхронизации. -
UnsupportedOperationException- если режим эксклюзивного доступа не поддерживается
tryRelease
protected boolean tryRelease(int arg)
Попытка установить состояние, отражающее освобождение в режиме эксклюзивного доступа.
Этот метод всегда вызывается потоком, выполняющим освобождение.
Реализация по умолчанию выбрасывает UnsupportedOperationException.
- Параметры:
-
arg- аргумент освобождения. Это значение всегда передается методу освобождения или текущее значение состояния при входе в ожидание условия. Значение в противном случае не интерпретируется и может представлять собой что угодно. - Возвращает:
-
trueесли этот объект теперь находится в полностью освобожденном состоянии, так что любые ожидающие потоки могут попытаться получить; иfalseв противном случае. - Исключения:
-
IllegalMonitorStateException- если освобождение приведет этот синхронизатор в незаконное состояние. Это исключение должно выбрасываться согласованным образом для корректной работы синхронизации. -
UnsupportedOperationException- если режим эксклюзивного доступа не поддерживается
tryAcquireShared
protected int tryAcquireShared(int arg)
Попытка получения в режиме совместного доступа. Этот метод должен проверить, позволяет ли состояние объекта получить его в режиме совместного доступа, и, если да, получить его.
Этот метод всегда вызывается потоком, выполняющим приобретение. Если этот метод сообщает об ошибке, метод приобретения может поместить поток в очередь, если он еще не в очереди, до тех пор, пока он не будет сигнализирован освобождением из другого потока.
Реализация по умолчанию выбрасывает UnsupportedOperationException.
- Параметры:
-
arg- аргумент приобретения. Это значение всегда передается методу приобретения или сохраняется при входе в ожидание условия. Значение в противном случае не интерпретируется и может представлять собой что угодно. - Возвращает:
- отрицательное значение при ошибке; ноль, если приобретение в режиме совместного доступа прошло успешно, но последующее приобретение в режиме совместного доступа не может быть успешным; и положительное значение, если приобретение в режиме совместного доступа прошло успешно и последующие приобретения в режиме совместного доступа могут быть также успешными, в этом случае последующий ожидающий поток должен проверить доступность. (Поддержка трех различных значений возврата позволяет использовать этот метод в контекстах, где приобретения иногда действуют исключительно.) При успехе этот объект приобретен.
- Исключения:
-
IllegalMonitorStateException- если приобретение приведет этот синхронизатор в незаконное состояние. Это исключение должно выбрасываться согласованным образом для корректной работы синхронизации. -
UnsupportedOperationException- если режим совместного доступа не поддерживается
tryReleaseShared
protected boolean tryReleaseShared(int arg)
Попытка установить состояние, отражающее освобождение в режиме совместного доступа.
Этот метод всегда вызывается потоком, выполняющим освобождение.
Реализация по умолчанию выбрасывает UnsupportedOperationException.
- Параметры:
-
arg- аргумент освобождения. Это значение всегда передается методу освобождения или текущее значение состояния при входе в ожидание условия. Значение в противном случае не интерпретируется и может представлять собой что угодно. - Возвращает:
-
trueесли это освобождение режима совместного доступа может позволить ожидающему приобретению (совместному или эксклюзивному) быть успешным; иfalseв противном случае - Исключения:
-
IllegalMonitorStateException- если освобождение приведет этот синхронизатор в незаконное состояние. Это исключение должно выбрасываться согласованным образом для корректной работы синхронизации. -
UnsupportedOperationException- если режим совместного доступа не поддерживается
isHeldExclusively
protected boolean isHeldExclusively()
Возвращает true , если синхронизация удерживается эксклюзивно по отношению к текущему (вызывающему) потоку. Этот метод вызывается при каждом вызове метода AbstractQueuedSynchronizer.ConditionObject.
Реализация по умолчанию выбрасывает 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.
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/locks/AbstractQueuedSynchronizer.html