Класс AbstractQueuedLongSynchronizer
- Все реализованные интерфейсы:
Serializable
public abstract class AbstractQueuedLongSynchronizer extends AbstractOwnableSynchronizer implements Serializable
AbstractQueuedSynchronizer, в которой состояние синхронизации поддерживается как long. Этот класс имеет точно такую же структуру, свойства и методы, что и AbstractQueuedSynchronizer, за исключением того, что все параметры и результаты, связанные с состоянием, определены как long, а не int. Этот класс может быть полезен при создании синхронизаторов, таких как многоуровневые блокировки и барьеры, которые требуют 64 бита состояния. См. AbstractQueuedSynchronizer для заметок по использованию и примеров.
- С тех пор:
- 1.6
- См. также:
Краткое описание вложенных классов
| Модификатор и тип | Класс | Описание |
|---|---|---|
class |
AbstractQueuedLongSynchronizer.ConditionObject |
Реализация условной переменной для AbstractQueuedLongSynchronizer, служащей основой для реализации Lock. |
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
AbstractQueuedLongSynchronizer() |
Конструктор для вызова подклассами. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
final void |
acquire |
Приобретение в эксклюзивном режиме, игнорируя прерывания. |
final void |
acquireInterruptibly |
Приобретение в эксклюзивном режиме, прерывая, если прерван. |
final void |
acquireShared |
Приобретение в совместном режиме, игнорируя прерывания. |
final void |
acquireSharedInterruptibly |
Приобретение в совместном режиме, прерывая, если прерван. |
protected final boolean |
compareAndSetState |
Атомарно устанавливает состояние синхронизации на заданное обновленное значение, если текущее значение состояния равно ожидаемому значению. |
final Collection<Thread> |
getExclusiveQueuedThreads() |
Возвращает коллекцию, содержащую потоки, которые могут ожидать приобретения в эксклюзивном режиме. |
final Thread |
getFirstQueuedThread() |
Возвращает первый (самый долгожданный) поток в очереди или null, если потоки в данный момент не в очереди. |
final Collection<Thread> |
getQueuedThreads() |
Возвращает коллекцию, содержащую потоки, которые могут ожидать приобретения. |
final int |
getQueueLength() |
Возвращает оценку количества потоков, ожидающих приобретения. |
final Collection<Thread> |
getSharedQueuedThreads() |
Возвращает коллекцию, содержащую потоки, которые могут ожидать приобретения в совместном режиме. |
protected final long |
getState() |
Возвращает текущее значение состояния синхронизации. |
final Collection<Thread> |
getWaitingThreads |
Возвращает коллекцию, содержащую те потоки, которые могут ожидать данной условной переменной, связанной с этим синхронизатором. |
final int |
getWaitQueueLength |
Возвращает оценку количества потоков, ожидающих данной условной переменной, связанной с этим синхронизатором. |
final boolean |
hasContended() |
Запрашивает, конкурировали ли потоки за приобретение этого синхронизатора; то есть, блокировался ли метод приобретения. |
final boolean |
hasQueuedPredecessors() |
Запрашивает, ожидали ли какие-либо потоки приобретения дольше текущего потока. |
final boolean |
hasQueuedThreads() |
Запрашивает, ожидают ли какие-либо потоки приобретения. |
final boolean |
hasWaiters |
Запрашивает, ожидают ли какие-либо потоки на данной условной переменной, связанной с этим синхронизатором. |
protected boolean |
isHeldExclusively() |
Возвращает true, если синхронизация удерживается в эксклюзивном режиме относительно текущего (вызывающего) потока. |
final boolean |
isQueued |
Возвращает true, если данный поток в данный момент в очереди. |
final boolean |
owns |
Запрашивает, использует ли данная условная переменная этот синхронизатор в качестве блокировки. |
final boolean |
release |
Освобождение в эксклюзивном режиме. |
final boolean |
releaseShared |
Освобождение в совместном режиме. |
protected final void |
setState |
Устанавливает значение состояния синхронизации. |
String |
toString() |
Возвращает строку, идентифицирующую этот синхронизатор, а также его состояние. |
protected boolean |
tryAcquire |
Попытка приобрести в эксклюзивном режиме. |
final boolean |
tryAcquireNanos |
Попытка приобрести в эксклюзивном режиме, прерывая, если прерван, и завершая неудачно, если заданный таймаут истек. |
protected long |
tryAcquireShared |
Попытка приобрести в совместном режиме. |
final boolean |
tryAcquireSharedNanos |
Попытка приобрести в совместном режиме, прерывая, если прерван, и завершая неудачно, если заданный таймаут истек. |
protected boolean |
tryRelease |
Попытка установить состояние, отражающее освобождение в эксклюзивном режиме. |
protected boolean |
tryReleaseShared |
Попытка установить состояние, отражающее освобождение в совместном режиме. |
Методы, объявленные в классе java.util.concurrent.locks.AbstractOwnableSynchronizer
getExclusiveOwnerThread, setExclusiveOwnerThread
Подробное описание конструкторов
AbstractQueuedLongSynchronizer
public AbstractQueuedLongSynchronizer()
Подробное описание методов
getState
protected final long getState()
volatile чтения.- Возвращает:
- текущее значение состояния
setState
protected final void setState(long newState)
volatile записи.- Параметры:
-
newState- новое значение состояния
compareAndSetState
protected final boolean compareAndSetState(long expect, long update)
volatile чтения и записи.- Параметры:
-
expect- ожидаемое значение -
update- новое значение - Возвращает:
-
true, если операция выполнена успешно. Возвращение False указывает на то, что фактическое значение не совпадало с ожидаемым.
tryAcquire
protected boolean tryAcquire(long arg)
Этот метод всегда вызывается нитью, выполняющей приобретение. Если этот метод сообщает об ошибке, метод acquire может поставить нить в очередь, если она ещё не в очереди, до тех пор, пока она не будет сигнализирована методом release другой нитью. Это можно использовать для реализации метода Lock.tryLock().
Метод по умолчанию выбрасывает UnsupportedOperationException.
- Параметры:
-
arg- аргумент приобретения. Это значение всегда передаётся методу acquire или сохраняется при входе в ожидание условия. Значение не интерпретируется и может представлять собой что угодно. - Возвращает:
-
true, если приобретение выполнено успешно. При успехе этот объект приобретён. - Исключения:
-
IllegalMonitorStateException- если приобретение поставило бы этот синхронизатор в незаконное состояние. Это исключение должно выбрасываться последовательным образом для корректной работы синхронизации. -
UnsupportedOperationException- если эксклюзивный режим не поддерживается
tryRelease
protected boolean tryRelease(long arg)
Этот метод всегда вызывается нитью, выполняющей освобождение.
Метод по умолчанию выбрасывает UnsupportedOperationException.
- Параметры:
-
arg- аргумент освобождения. Это значение всегда передаётся методу release или текущее значение состояния при входе в ожидание условия. Значение не интерпретируется и может представлять собой что угодно. - Возвращает:
-
true, если этот объект теперь находится в полностью освобождённом состоянии, так что любые ожидающие нити могут попытаться приобрести; иfalseв противном случае. - Исключения:
-
IllegalMonitorStateException- если освобождение поставило бы этот синхронизатор в незаконное состояние. Это исключение должно выбрасываться последовательным образом для корректной работы синхронизации. -
UnsupportedOperationException- если эксклюзивный режим не поддерживается
isHeldExclusively
protected boolean isHeldExclusively()
true , если синхронизация удерживается эксклюзивно по отношению к текущей (вызывающей) нити. Этот метод вызывается при каждом вызове метода AbstractQueuedLongSynchronizer.ConditionObject. Метод по умолчанию выбрасывает UnsupportedOperationException. Этот метод вызывается только внутри методов AbstractQueuedLongSynchronizer.ConditionObject, поэтому не нужно определять его, если условия не используются.
- Возвращает:
-
true, если синхронизация удерживается эксклюзивно;falseв противном случае - Исключения:
-
UnsupportedOperationException- если условия не поддерживаются
acquire
public final void acquire(long arg)
tryAcquire(long), возвращаясь при успехе. В противном случае нить помещается в очередь, возможно, многократно блокируется и разблокируется, вызывая tryAcquire(long) до тех пор, пока не будет достигнута успешность. Этот метод может быть использован для реализации метода Lock.lock().- Параметры:
-
arg- аргумент приобретения. Это значение передаётся методуtryAcquire(long), но в противном случае не интерпретируется и может представлять собой что угодно.
acquireInterruptibly
public final void acquireInterruptibly(long arg) throws InterruptedException
tryAcquire(long), возвращаясь при успехе. В противном случае нить помещается в очередь, возможно, многократно блокируется и разблокируется, вызывая tryAcquire(long) до тех пор, пока не будет достигнута успешность или нить не будет прервана. Этот метод может быть использован для реализации метода Lock.lockInterruptibly().- Параметры:
-
arg- аргумент приобретения. Это значение передаётся методуtryAcquire(long), но в противном случае не интерпретируется и может представлять собой что угодно. - Исключения:
-
InterruptedException- если текущая нить прервана
tryAcquireNanos
public final boolean tryAcquireNanos(long arg, long nanosTimeout) throws InterruptedException
tryAcquire(long), возвращаясь при успехе. В противном случае нить помещается в очередь, возможно, многократно блокируется и разблокируется, вызывая tryAcquire(long), пока не будет достигнута успешность, нить не будет прервана или не истечёт таймаут. Этот метод можно использовать для реализации метода Lock.tryLock(long, TimeUnit).- Параметры:
-
arg- аргумент приобретения. Это значение передаётся методуtryAcquire(long), но в противном случае не интерпретируется и может представлять собой что угодно. -
nanosTimeout- максимальное время ожидания в наносекундах - Возвращает:
-
true, если приобретение выполнено;false, если таймаут истек - Исключения:
-
InterruptedException- если текущая нить прервана
release
public final boolean release(long arg)
tryRelease(long) возвращает true. Этот метод может быть использован для реализации метода Lock.unlock().- Параметры:
-
arg- аргумент освобождения. Это значение передаётся методуtryRelease(long), но в противном случае не интерпретируется и может представлять собой что угодно. - Возвращает:
- значение, возвращаемое из
tryRelease(long)
hasQueuedThreads
public final boolean hasQueuedThreads()
true не гарантирует, что любой другой поток когда-либо приобретёт.- Returns:
-
trueесли могут быть другие потоки, ожидающие приобретения
hasContended
public final boolean hasContended()
В этой реализации эта операция возвращает за константное время.
- Returns:
-
trueесли когда-либо была конкуренция
getFirstQueuedThread
public final Thread getFirstQueuedThread()
null если в данный момент в очереди нет потоков. В этой реализации эта операция обычно возвращает за константное время, но может итерироваться при возникновении конкуренции, если другие потоки одновременно изменяют очередь.
- Returns:
- первый (самый долго ожидающий) поток в очереди или
nullесли в данный момент в очереди нет потоков
isQueued
public final boolean isQueued(Thread thread)
Эта реализация обходит очередь, чтобы определить наличие данного потока.
- Parameters:
-
thread- поток - Returns:
-
trueесли данный поток находится в очереди - Throws:
-
NullPointerException- если поток равен null
hasQueuedPredecessors
public final boolean hasQueuedPredecessors()
Вызов этого метода эквивалентен (но может быть более эффективным, чем):
getFirstQueuedThread() != Thread.currentThread()
&& hasQueuedThreads() Обратите внимание, что из-за отмены из-за прерываний и таймаутов, которые могут произойти в любое время, возвращение true не гарантирует, что какой-либо другой поток приобретёт перед текущим потоком. Аналогично, возможно, что другой поток выиграет гонку для добавления в очередь после того, как этот метод вернёт false, из-за того, что очередь пуста.
Этот метод разработан для использования справедливым синхронизатором, чтобы избежать перебивания. Метод tryAcquire(long) такого синхронизатора должен возвращать false, а метод tryAcquireShared(long) должен возвращать отрицательное значение, если этот метод возвращает true (если это не повторное приобретение). Например, метод
tryAcquire для справедливого, повторного, синхронизатора в режиме исключения может выглядеть следующим образом:
protected boolean tryAcquire(long arg) {
if (isHeldExclusively()) {
// A reentrant acquire; increment hold count
return true;
} else if (hasQueuedPredecessors()) {
return false;
} else {
// try to acquire normally
}
}
- Returns:
-
trueесли в очереди есть поток, предшествующий текущему потоку, иfalseесли текущий поток находится в голове очереди или очередь пуста - Since:
- 1.7
getQueueLength
public final int getQueueLength()
- Returns:
- оценочное количество ожидающих потоков
getQueuedThreads
public final Collection<Thread> getQueuedThreads()
- Returns:
- коллекция потоков
getExclusiveQueuedThreads
public final Collection<Thread> getExclusiveQueuedThreads()
getQueuedThreads(), за исключением того, что он возвращает только те потоки, которые ожидают из-за исключительного приобретения.- Returns:
- коллекция потоков
toString
public String toString()
"State =" , за которой следует текущее значение getState(), и либо "nonempty" , либо "empty" , в зависимости от того, пуста ли очередь.- Overrides:
-
toStringв классеObject - Returns:
- строка, идентифицирующая этот синхронизатор, а также его состояние
owns
public final boolean owns(AbstractQueuedLongSynchronizer.ConditionObject condition)
- Parameters:
-
condition- условие - Returns:
-
trueесли принадлежит - Throws:
-
NullPointerException- если условие равно null
hasWaiters
public final boolean hasWaiters(AbstractQueuedLongSynchronizer.ConditionObject condition)
true не гарантирует, что в будущем signal разбудит какие-либо потоки. Этот метод предназначен в основном для использования в мониторинге состояния системы.- Parameters:
-
condition- условие - Returns:
-
trueесли есть ожидающие потоки - Throws:
-
IllegalMonitorStateException- если синхронизация исключения не удерживается -
IllegalArgumentException- если данное условие не связано с этим синхронизатором -
NullPointerException- если условие равно null
Длина очереди ожидания
public final int getWaitQueueLength(AbstractQueuedLongSynchronizer.ConditionObject condition)
- Параметры:
-
condition- условие - Возвращает:
- оцененное количество ожидающих потоков
- Исключения:
-
IllegalMonitorStateException- если эксклюзивная синхронизация не выполняется -
IllegalArgumentException- если заданное условие не связано с этим синхронизатором -
NullPointerException- если условие равно null
Ожидающие потоки
public final Collection<Thread> getWaitingThreads(AbstractQueuedLongSynchronizer.ConditionObject condition)
- Параметры:
-
condition- условие - Возвращает:
- коллекция потоков
- Исключения:
-
IllegalMonitorStateException- если эксклюзивная синхронизация не выполняется -
IllegalArgumentException- если заданное условие не связано с этим синхронизатором -
NullPointerException- если условие равно null
© 1993, 2021, 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/17/docs/api/java.base/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.html