Spec-Zone.ru › OpenJDK 27

Класс 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() должен сообщать, удерживается ли блокировка синхронизации эксклюзивно текущим потоком; вызванный с текущим значением getState() метод release(int) должен полностью освобождать этот объект; а базовая версия метода acquire(int) должна в конечном итоге восстанавливать прежнее состояние захвата объекта, получив сохранённое значение состояния. Другой метод AbstractQueuedSynchronizer не создаёт такое условие, поэтому не используйте его, если это требование не может быть выполнено. Поведение AbstractQueuedSynchronizer.ConditionObject, конечно, зависит от семантики реализации синхронизатора.

Этот класс предоставляет методы проверки, инструментирования и мониторинга внутренней очереди, а также аналогичные методы для объектов условий. При необходимости их можно предоставить классам, использующим AbstractQueuedSynchronizer для реализации механизмов синхронизации.

При сериализации этого класса сохраняется только базовое атомарное целое число, хранящее состояние, поэтому у десериализованных объектов очереди потоков будут пустыми. Типичные подклассы, которым требуется поддержка сериализации, определяют метод readObject, восстанавливающий известное начальное состояние после десериализации.

Использование

Чтобы использовать этот класс как основу синхронизатора, переопределите следующие методы (при необходимости), проверяя и/или изменяя состояние синхронизации с помощью getState(), setState(int) и/или compareAndSetState(int, int):

  • tryAcquire(int)
  • tryRelease(int)
  • tryAcquireShared(int)
  • tryReleaseShared(int)
  • isHeldExclusively()
По умолчанию каждый из этих методов выбрасывает исключение 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;
(Разделяемый режим устроен сходным образом, но может включать каскадную передачу сигналов.)

Поскольку проверки при захвате выполняются до помещения потока в очередь, новый поток, пытающийся выполнить захват, может обойти другие заблокированные потоки, уже находящиеся в очереди. Однако при необходимости можно определить 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
Реализация Condition для AbstractQueuedSynchronizer, служащего основой для реализации Lock.

Краткое описание конструкторов

AbstractQueuedSynchronizer()
Модификатор Конструктор Описание
protected
Создаёт новый экземпляр AbstractQueuedSynchronizer с начальным состоянием синхронизации, равным нулю.

Краткое описание методов

Модификатор и тип Метод Описание
final void acquire(int arg)
Выполняет захват в эксклюзивном режиме, игнорируя прерывания.
final void acquireInterruptibly(int arg)
Выполняет захват в эксклюзивном режиме; прерывание прерывает операцию.
final void acquireShared(int arg)
Выполняет захват в разделяемом режиме, игнорируя прерывания.
final void acquireSharedInterruptibly(int arg)
Выполняет захват в разделяемом режиме; прерывание прерывает операцию.
protected final boolean compareAndSetState(int expect, int update)
Атомарно устанавливает состояние синхронизации в указанное новое значение, если текущее значение состояния равно ожидаемому.
final Collection<Thread> getExclusiveQueuedThreads()
Возвращает коллекцию, содержащую потоки, которые могут ожидать захвата в эксклюзивном режиме.
final Thread getFirstQueuedThread()
Возвращает первый (ожидающий дольше всех) поток в очереди или null, если в очереди нет потоков.
final Collection<Thread> getQueuedThreads()
Возвращает коллекцию, содержащую потоки, которые могут ожидать захвата.
final int getQueueLength()
Возвращает оценочное число потоков, ожидающих захвата.
final Collection<Thread> getSharedQueuedThreads()
Возвращает коллекцию, содержащую потоки, которые могут ожидать захвата в разделяемом режиме.
protected final int getState()
Возвращает текущее значение состояния синхронизации.
final Collection<Thread> getWaitingThreads(AbstractQueuedSynchronizer.ConditionObject condition)
Возвращает коллекцию, содержащую потоки, которые могут ожидать указанного условия, связанного с этим синхронизатором.
final int getWaitQueueLength(AbstractQueuedSynchronizer.ConditionObject condition)
Возвращает оценочное число потоков, ожидающих указанного условия, связанного с этим синхронизатором.
final boolean hasContended()
Проверяет, пытались ли потоки когда-либо захватить этот синхронизатор в условиях конкуренции, то есть блокировался ли когда-нибудь метод захвата.
final boolean hasQueuedPredecessors()
Проверяет, ожидают ли какие-либо потоки захвата дольше текущего потока.
final boolean hasQueuedThreads()
Проверяет, ожидают ли какие-либо потоки захвата.
final boolean hasWaiters(AbstractQueuedSynchronizer.ConditionObject condition)
Проверяет, ожидают ли какие-либо потоки указанного условия, связанного с этим синхронизатором.
protected boolean isHeldExclusively()
Возвращает true, если синхронизация удерживается эксклюзивно относительно текущего (вызывающего) потока.
final boolean isQueued(Thread thread)
Возвращает true, если указанный поток в данный момент находится в очереди.
final boolean owns(AbstractQueuedSynchronizer.ConditionObject condition)
Проверяет, использует ли указанный ConditionObject этот синхронизатор в качестве блокировки.
final boolean release(int arg)
Освобождает в эксклюзивном режиме.
final boolean releaseShared(int arg)
Освобождает в разделяемом режиме.
protected final void setState(int newState)
Устанавливает значение состояния синхронизации.
String toString()
Возвращает строку, идентифицирующую этот синхронизатор и его состояние.
protected boolean tryAcquire(int arg)
Пытается выполнить захват в эксклюзивном режиме.
final boolean tryAcquireNanos(int arg, long nanosTimeout)
Пытается выполнить захват в эксклюзивном режиме; операция прерывается при прерывании и завершается неудачей по истечении указанного времени ожидания.
protected int tryAcquireShared(int arg)
Пытается выполнить захват в разделяемом режиме.
final boolean tryAcquireSharedNanos(int arg, long nanosTimeout)
Пытается выполнить захват в разделяемом режиме; операция прерывается при прерывании и завершается неудачей по истечении указанного времени ожидания.
protected boolean tryRelease(int arg)
Пытается изменить состояние, отражая освобождение в эксклюзивном режиме.
protected boolean tryReleaseShared(int arg)
Пытается изменить состояние, отражая освобождение в разделяемом режиме.

Методы, объявленные в классе AbstractOwnableSynchronizer

getExclusiveOwnerThread, setExclusiveOwnerThread
Модификатор и тип Метод Описание
protected final Thread getExclusiveOwnerThread()
Возвращает поток, последний раз установленный методом setExclusiveOwnerThread, или null, если он никогда не устанавливался.
protected final void setExclusiveOwnerThread(Thread thread)
Устанавливает поток, который в данный момент владеет эксклюзивным доступом.

Методы, объявленные в классе Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
Модификатор и тип Метод Описание
protected Object clone()
Создаёт и возвращает копию этого объекта.
boolean equals(Object obj)
Показывает, равен ли другой объект этому объекту.
protected void finalize()
Устарело, будет удалено: этот элемент API может быть удалён в будущей версии.
Финализация устарела и будет удалена в одном из будущих выпусков.
final Class<?> getClass()
Возвращает класс времени выполнения для этого Object.
int hashCode()
Возвращает хеш-код этого объекта.
final void notify()
Будит один поток, ожидающий на мониторе этого объекта.
final void notifyAll()
Будит все потоки, ожидающие на мониторе этого объекта.
final void wait()
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова notify или interrupt.
final void wait(long timeoutMillis)
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова notify или interrupt, либо до истечения заданного промежутка реального времени.
final void wait(long timeoutMillis, int nanos)
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова notify или interrupt, либо до истечения заданного промежутка реального времени.

Подробное описание конструкторов

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

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в разделе Документация Java SE, содержащем более подробные описания для разработчиков, в том числе концептуальные обзоры, определения терминов, обходные решения и рабочие примеры кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или ее аффилированных лиц в США и других странах.
Авторское право © 1993, 2026, Oracle и/или ее аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 1993, 2025, 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API