Класс AbstractQueuedLongSynchronizer
- java.lang.Object
-
- java.util.concurrent.locks.AbstractOwnableSynchronizer
-
- java.util.concurrent.locks.AbstractQueuedLongSynchronizer
- Все реализованные интерфейсы:
- Serializable
public abstract class AbstractQueuedLongSynchronizer extends AbstractOwnableSynchronizer implements Serializable
Версия AbstractQueuedSynchronizer, в которой состояние синхронизации поддерживается как long. Этот класс имеет точно такую же структуру, свойства и методы, как AbstractQueuedSynchronizer за исключением того, что все параметры и результаты, связанные с состоянием, определены как long а не int. Этот класс может быть полезен при создании синхронизаторов, таких как многоуровневые блокировки и барьеры, которым требуется 64 бита состояния.
См. AbstractQueuedSynchronizer для заметок по использованию и примеров.
- С момента:
- 1.6
- См. также:
- Сериализованная форма
Вложенные классы
| Модификатор и тип | Класс и описание |
|---|---|
class |
AbstractQueuedLongSynchronizer.ConditionObject Реализация условия для |
Конструкторы
| Модификатор | Конструктор и описание |
|---|---|
protected |
AbstractQueuedLongSynchronizer() Создает новый экземпляр |
Методы
| Модификатор и тип | Метод и описание |
|---|---|
void |
acquire(long arg) Приобретает в эксклюзивном режиме, игнорируя прерывания. |
void |
acquireInterruptibly(long arg) Приобретает в эксклюзивном режиме, прерывая, если прервано. |
void |
acquireShared(long arg) Приобретает в общем режиме, игнорируя прерывания. |
void |
acquireSharedInterruptibly(long arg) Приобретает в общем режиме, прерывая, если прервано. |
protected boolean |
compareAndSetState(long expect,
long update) Атомарно устанавливает состояние синхронизации в заданное обновленное значение, если текущее значение состояния равно ожидаемому значению. |
Collection<Thread> |
getExclusiveQueuedThreads() Возвращает коллекцию, содержащую потоки, которые могут ожидать приобретения в эксклюзивном режиме. |
Thread |
getFirstQueuedThread() Возвращает первый (самый ожидающий) поток в очереди или |
Collection<Thread> |
getQueuedThreads() Возвращает коллекцию, содержащую потоки, которые могут ожидать приобретения. |
int |
getQueueLength() Возвращает оценку количества потоков, ожидающих приобретения. |
Collection<Thread> |
getSharedQueuedThreads() Возвращает коллекцию, содержащую потоки, которые могут ожидать приобретения в общем режиме. |
protected long |
getState() Возвращает текущее значение состояния синхронизации. |
Collection<Thread> |
getWaitingThreads(AbstractQueuedLongSynchronizer.ConditionObject condition) Возвращает коллекцию, содержащую те потоки, которые могут ожидать заданного условия, связанного с этим синхронизатором. |
int |
getWaitQueueLength(AbstractQueuedLongSynchronizer.ConditionObject condition) Возвращает оценку количества потоков, ожидающих заданного условия, связанного с этим синхронизатором. |
boolean |
hasContended() Запрашивает, оспаривали ли когда-либо потоки приобретение этого синхронизатора; то есть, блокировался ли когда-либо метод приобретения. |
boolean |
hasQueuedPredecessors() Запрашивает, ожидали ли какие-либо потоки приобретения дольше, чем текущий поток. |
boolean |
hasQueuedThreads() Запрашивает, ожидают ли какие-либо потоки приобретения. |
boolean |
hasWaiters(AbstractQueuedLongSynchronizer.ConditionObject condition) Запрашивает, ожидают ли какие-либо потоки заданного условия, связанного с этим синхронизатором. |
protected boolean |
isHeldExclusively() Возвращает |
boolean |
isQueued(Thread thread) Возвращает true, если данный поток в настоящее время находится в очереди. |
boolean |
owns(AbstractQueuedLongSynchronizer.ConditionObject condition) Запрашивает, использует ли данный ConditionObject этот синхронизатор в качестве своей блокировки. |
boolean |
release(long arg) Освобождает в эксклюзивном режиме. |
boolean |
releaseShared(long arg) Освобождает в общем режиме. |
protected void |
setState(long newState) Устанавливает значение состояния синхронизации. |
String |
toString() Возвращает строку, идентифицирующую этот синхронизатор, а также его состояние. |
protected boolean |
tryAcquire(long arg) Пытается приобрести в эксклюзивном режиме. |
boolean |
tryAcquireNanos(long arg,
long nanosTimeout) Пытается приобрести в эксклюзивном режиме, прерывая, если прервано, и завершая неудачей, если истекает заданный тайм-аут. |
protected long |
tryAcquireShared(long arg) Пытается приобрести в общем режиме. |
boolean |
tryAcquireSharedNanos(long arg,
long nanosTimeout) Пытается приобрести в общем режиме, прерывая, если прервано, и завершая неудачей, если истекает заданный тайм-аут. |
protected boolean |
tryRelease(long arg) Пытается установить состояние, чтобы отразить освобождение в эксклюзивном режиме. |
protected boolean |
tryReleaseShared(long arg) Пытается установить состояние, чтобы отразить освобождение в общем режиме. |
Методы, унаследованные от класса java.util.concurrent.locks.AbstractOwnableSynchronizer
getExclusiveOwnerThread, setExclusiveOwnerThread Методы, унаследованные от класса java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait Краткое описание конструкторов
AbstractQueuedLongSynchronizer
protected AbstractQueuedLongSynchronizer()
Создает новый экземпляр 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если успешно. Ложное значение указывает на то, что фактическое значение не было равно ожидаемому значению.
tryAcquire
protected boolean tryAcquire(long arg)
Пытается получить в эксклюзивном режиме. Этот метод должен проверить, позволяет ли состояние объекта получить его в эксклюзивном режиме, и если да, то получить его.
Этот метод всегда вызывается потоком, выполняющим приобретение. Если этот метод сообщает об ошибке, метод приобретения может поставить поток в очередь, если он еще не находится в очереди, пока он не получит сигнал от другого потока. Это может использоваться для реализации метода Lock.tryLock().
Реализация по умолчанию вызывает исключение UnsupportedOperationException.
- Параметры:
-
arg- аргумент приобретения. Это значение всегда является тем, которое передается методу приобретения, или значением, сохраненным при входе в ожидание состояния. В противном случае значение не интерпретируется и может представлять что угодно. - Возвращает:
-
trueесли успешно. После успешного завершения этот объект был приобретен. - Исключения:
-
IllegalMonitorStateException- если приобретение поместит этот синхронизатор в недопустимое состояние. Это исключение должно быть выброшено согласованным образом для правильной работы синхронизации. -
UnsupportedOperationException- если эксклюзивный режим не поддерживается
tryRelease
protected boolean tryRelease(long arg)
Пытается установить состояние, отражающее освобождение в эксклюзивном режиме.
Этот метод всегда вызывается потоком, выполняющим освобождение.
Реализация по умолчанию вызывает исключение UnsupportedOperationException.
- Параметры:
-
arg- аргумент освобождения. Это значение всегда является тем, которое передается методу освобождения, или текущим значением состояния при входе в ожидание состояния. В противном случае значение не интерпретируется и может представлять что угодно. - Возвращает:
-
trueесли этот объект теперь находится в полностью освобожденном состоянии, так что любые ожидающие потоки могут попытаться приобрести; иfalseв противном случае. - Исключения:
-
IllegalMonitorStateException- если освобождение поместит этот синхронизатор в недопустимое состояние. Это исключение должно быть выброшено согласованным образом для правильной работы синхронизации. -
UnsupportedOperationException- если эксклюзивный режим не поддерживается
tryAcquireShared
protected long tryAcquireShared(long arg)
Пытается получить в общем режиме. Этот метод должен проверить, позволяет ли состояние объекта получить его в общем режиме, и если да, то получить его.
Этот метод всегда вызывается потоком, выполняющим приобретение. Если этот метод сообщает об ошибке, метод приобретения может поставить поток в очередь, если он еще не находится в очереди, пока он не получит сигнал от другого потока.
Реализация по умолчанию вызывает исключение UnsupportedOperationException.
- Параметры:
-
arg- аргумент приобретения. Это значение всегда является тем, которое передается методу приобретения, или значением, сохраненным при входе в ожидание состояния. В противном случае значение не интерпретируется и может представлять что угодно. - Возвращает:
- отрицательное значение при ошибке; ноль, если приобретение в общем режиме прошло успешно, но последующее приобретение в общем режиме не может быть успешным; и положительное значение, если приобретение в общем режиме прошло успешно и последующие приобретения в общем режиме также могут быть успешными, в этом случае последующий ожидающий поток должен проверить доступность. (Поддержка трех различных возвращаемых значений позволяет использовать этот метод в контекстах, где приобретения только иногда действуют исключительно). После успешного завершения этот объект был приобретен.
- Исключения:
-
IllegalMonitorStateException- если приобретение поместит этот синхронизатор в недопустимое состояние. Это исключение должно быть выброшено согласованным образом для правильной работы синхронизации. -
UnsupportedOperationException- если общий режим не поддерживается
tryReleaseShared
protected boolean tryReleaseShared(long arg)
Пытается установить состояние, отражающее освобождение в общем режиме.
Этот метод всегда вызывается потоком, выполняющим освобождение.
Реализация по умолчанию вызывает исключение UnsupportedOperationException.
- Параметры:
-
arg- аргумент освобождения. Это значение всегда является тем, которое передается методу освобождения, или текущим значением состояния при входе в ожидание состояния. В противном случае значение не интерпретируется и может представлять что угодно. - Возвращает:
-
trueесли это освобождение общего режима может позволить ожидающему приобретению (общему или эксклюзивному) завершиться успешно; иfalseв противном случае - Исключения:
-
IllegalMonitorStateException- если освобождение поместит этот синхронизатор в недопустимое состояние. Это исключение должно быть выброшено согласованным образом для правильной работы синхронизации. -
UnsupportedOperationException- если общий режим не поддерживается
isHeldExclusively
protected boolean isHeldExclusively()
Возвращает true если синхронизация удерживается исключительно относительно текущего (вызывающего) потока. Этот метод вызывается при каждом вызове метода AbstractQueuedLongSynchronizer.ConditionObject, не ожидающего. (Ожидающие методы вместо этого вызывают release(long)).
Реализация по умолчанию вызывает исключение 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)
acquireShared
public final void acquireShared(long arg)
Приобретает в общем режиме, игнорируя прерывания. Реализуется путем вызова хотя бы один раз tryAcquireShared(long), возвращаясь при успехе. В противном случае поток помещается в очередь, возможно, многократно блокируясь и разблокируясь, вызывая tryAcquireShared(long) до успеха.
- Параметры:
-
arg- аргумент приобретения. Это значение передается вtryAcquireShared(long), но в остальном не интерпретируется и может представлять что угодно.
acquireSharedInterruptibly
public final void acquireSharedInterruptibly(long arg)
throws InterruptedException Приобретает в общем режиме, прерываясь, если прерван. Реализуется путем первой проверки состояния прерывания, затем вызова хотя бы один раз tryAcquireShared(long), возвращаясь при успехе. В противном случае поток помещается в очередь, возможно, многократно блокируясь и разблокируясь, вызывая tryAcquireShared(long) до успеха или прерывания потока.
- Параметры:
-
arg- аргумент приобретения. Это значение передается вtryAcquireShared(long), но в остальном не интерпретируется и может представлять что угодно. - Исключения:
-
InterruptedException- если текущий поток прерван
tryAcquireSharedNanos
public final boolean tryAcquireSharedNanos(long arg,
long nanosTimeout)
throws InterruptedException Пытается приобрести в общем режиме, прерываясь, если прерван, и завершаясь неудачей, если истекает заданный тайм-аут. Реализуется путем первой проверки состояния прерывания, затем вызова хотя бы один раз tryAcquireShared(long), возвращаясь при успехе. В противном случае поток помещается в очередь, возможно, многократно блокируясь и разблокируясь, вызывая tryAcquireShared(long) до успеха, прерывания потока или истечения тайм-аута.
- Параметры:
-
arg- аргумент приобретения. Это значение передается вtryAcquireShared(long), но в остальном не интерпретируется и может представлять что угодно. -
nanosTimeout- максимальное время ожидания в наносекундах - Возвращает:
-
trueесли приобретено;falseесли истекло время ожидания - Исключения:
-
InterruptedException- если текущий поток прерван
releaseShared
public final boolean releaseShared(long arg)
Освобождает в общем режиме. Реализуется путем разблокировки одного или нескольких потоков, если tryReleaseShared(long) возвращает true.
- Параметры:
-
arg- аргумент освобождения. Это значение передается вtryReleaseShared(long), но в остальном не интерпретируется и может представлять что угодно. - Возвращает:
- значение, возвращаемое из
tryReleaseShared(long)
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(long) такого синхронизатора должен возвращать false, а его метод tryAcquireShared(long) должен возвращать отрицательное значение, если этот метод возвращает 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(AbstractQueuedLongSynchronizer.ConditionObject condition)
Запрашивает, использует ли данный ConditionObject этот синхронизатор в качестве своего блокировки.
- Параметры:
-
condition- условие - Возвращает:
-
trueесли принадлежит - Исключения:
-
NullPointerException- если условие равно null
hasWaiters
public final boolean hasWaiters(AbstractQueuedLongSynchronizer.ConditionObject condition)
Запрашивает, ожидают ли какие-либо потоки данного условия, связанного с этим синхронизатором. Обратите внимание, что поскольку тайм-ауты и прерывания могут происходить в любое время, возврат true не гарантирует, что будущий signal разбудит какие-либо потоки. Этот метод предназначен в первую очередь для использования в мониторинге состояния системы.
- Параметры:
-
condition- условие - Возвращает:
-
trueесли есть какие-либо ожидающие потоки - Исключения:
-
IllegalMonitorStateException- если эксклюзивная синхронизация не удерживается -
IllegalArgumentException- если данное условие не связано с этим синхронизатором -
NullPointerException- если условие равно null
getWaitQueueLength
public final int getWaitQueueLength(AbstractQueuedLongSynchronizer.ConditionObject condition)
Возвращает оценку количества потоков, ожидающих данного условия, связанного с этим синхронизатором. Обратите внимание, что поскольку тайм-ауты и прерывания могут происходить в любое время, оценка служит только верхней границей фактического количества ожидающих. Этот метод предназначен для использования в мониторинге состояния системы, а не для управления синхронизацией.
- Параметры:
-
condition- условие - Возвращает:
- оценочное количество ожидающих потоков
- Исключения:
-
IllegalMonitorStateException- если эксклюзивная синхронизация не удерживается -
IllegalArgumentException- если данное условие не связано с этим синхронизатором -
NullPointerException- если условие равно null
getWaitingThreads
public final Collection<Thread> getWaitingThreads(AbstractQueuedLongSynchronizer.ConditionObject condition)
Возвращает коллекцию, содержащую потоки, которые могут ожидать заданное условие, связанное с этим синхронизатором. Поскольку фактический набор потоков может динамически изменяться во время построения этого результата, возвращаемая коллекция является лишь приблизительной оценкой. Элементы возвращаемой коллекции не упорядочены.
- Parameters:
-
condition- the condition - Returns:
- коллекция потоков
- Throws:
-
IllegalMonitorStateException- if exclusive synchronization is not held -
IllegalArgumentException- if the given condition is not associated with this synchronizer -
NullPointerException- if the condition is 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.