Spec-Zone.ru › OpenJDK 24

Класс 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(java.util.concurrent.locks.AbstractQueuedSynchronizer.Node, int, boolean, boolean, boolean, long), учитывая это сохранённое значение состояния, в конечном счёте восстанавливает этот объект в его предыдущее состояние приобретения. Ни один 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;
 
(Совместный режим аналогичен, но может включать каскадные сигналы.)

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

Методы, объявленные в классе java.util.concurrent.locks.AbstractOwnableSynchronizer

getExclusiveOwnerThread, setExclusiveOwnerThread

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

clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

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

AbstractQueuedSynchronizer

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

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

getState

protected final int getState()
Возвращает текущее значение состояния синхронизации. Эта операция имеет семантику памяти volatile чтения.
Возвращает:
текущее значение состояния

setState

protected final void setState(int newState)
Устанавливает значение состояния синхронизации. Эта операция имеет семантику памяти volatile записи.
Параметры:
newState - новое значение состояния

compareAndSetState

protected final boolean compareAndSetState(int expect, int update)
Атомарно устанавливает состояние синхронизации на заданное обновлённое значение, если текущее значение состояния равно ожидаемому значению. Эта операция имеет семантику памяти volatile чтения и записи.
Параметры:
expect - ожидаемое значение
update - новое значение
Возвращает:
true в случае успеха. Возврат False указывает, что фактическое значение не было равно ожидаемому значению.

tryAcquire

protected boolean tryAcquire(int arg)
Попытка захвата в эксклюзивном режиме. Этот метод должен запросить, разрешает ли состояние объекта его захват в эксклюзивном режиме, и в случае положительного ответа захватить его.

Этот метод всегда вызывается потоком, выполняющим захват. Если этот метод сообщает об ошибке, метод acquire может поместить поток в очередь, если он ещё не находится в очереди, до тех пор, пока он не будет сигнализирован выходом из режима ожидания другим потоком. Это можно использовать для реализации метода Lock.tryLock().

Стандартная реализация выбрасывает UnsupportedOperationException.

Параметры:
arg - аргумент захвата. Это значение всегда является тем, которое передаётся методу acquire, или значением, сохранённым при входе в ожидание условия. В противном случае значение не интерпретируется и может представлять что угодно.
Возвращает:
true в случае успеха. При успехе объект был захвачен.
Исключение:
IllegalMonitorStateException - если захват поместит этот синхронизатор в недопустимое состояние. Это исключение должно выбрасываться согласованным образом для правильной работы синхронизации.
UnsupportedOperationException - если режим эксклюзивного доступа не поддерживается

tryRelease

protected boolean tryRelease(int arg)
Попытка установить состояние, отражающее освобождение в эксклюзивном режиме.

Этот метод всегда вызывается потоком, выполняющим освобождение.

Стандартная реализация выбрасывает UnsupportedOperationException.

Параметры:
arg - аргумент освобождения. Это значение всегда является тем, которое передаётся методу release, или текущее значение состояния при входе в ожидание условия. В противном случае значение не интерпретируется и может представлять что угодно.
Возвращает:
true, если этот объект сейчас находится в полностью освобождённом состоянии, так что любые ожидающие потоки могут попытаться захватить; и false в противном случае.
Исключение:
IllegalMonitorStateException - если освобождение поместит этот синхронизатор в недопустимое состояние. Это исключение должно выбрасываться согласованным образом для правильной работы синхронизации.
UnsupportedOperationException - если режим эксклюзивного доступа не поддерживается

tryAcquireShared

protected int tryAcquireShared(int arg)
Попытка захвата в совместном режиме. Этот метод должен запросить, разрешает ли состояние объекта его захват в совместном режиме, и в случае положительного ответа захватить его.

Этот метод всегда вызывается потоком, выполняющим захват. Если этот метод сообщает об ошибке, метод acquire может поместить поток в очередь, если он ещё не находится в очереди, до тех пор, пока он не будет сигнализирован выходом из режима ожидания другим потоком.

Стандартная реализация выбрасывает UnsupportedOperationException.

Параметры:
arg - аргумент захвата. Это значение всегда является тем, которое передаётся методу acquire, или значением, сохранённым при входе в ожидание условия. В противном случае значение не интерпретируется и может представлять что угодно.
Возвращает:
отрицательное значение при ошибке; ноль, если захват в совместном режиме удался, но последующий захват в совместном режиме не может быть успешным; и положительное значение, если захват в совместном режиме удался и последующие захваты в совместном режиме также могут быть успешными, в этом случае последующий ожидающий поток должен проверить доступность. (Поддержка трёх различных значений возврата позволяет использовать этот метод в контекстах, где захваты иногда действуют исключительно.) При успехе этот объект был захвачен.
Исключение:
IllegalMonitorStateException - если захват поместит этот синхронизатор в недопустимое состояние. Это исключение должно выбрасываться согласованным образом для правильной работы синхронизации.
UnsupportedOperationException - если совместный режим не поддерживается

tryReleaseShared

protected boolean tryReleaseShared(int arg)
Попытка установить состояние, отражающее освобождение в совместном режиме.

Этот метод всегда вызывается потоком, выполняющим освобождение.

Стандартная реализация выбрасывает UnsupportedOperationException.

Параметры:
arg - аргумент освобождения. Это значение всегда является тем, которое передаётся методу release, или текущее значение состояния при входе в ожидание условия. В противном случае значение не интерпретируется и может представлять что угодно.
Возвращает:
true, если это освобождение совместного режима может позволить ожидающему захвату (совместному или эксклюзивному) быть успешным; и false в противном случае
Исключение:
IllegalMonitorStateException - если освобождение поместит этот синхронизатор в недопустимое состояние. Это исключение должно выбрасываться согласованным образом для правильной работы синхронизации.
UnsupportedOperationException - если совместный режим не поддерживается

isHeldExclusively

protected boolean isHeldExclusively()
Возвращает true, если синхронизация удерживается эксклюзивно по отношению к текущему (вызывающему) потоку. Этот метод вызывается при каждом вызове метода AbstractQueuedSynchronizer.ConditionObject.

Стандартная реализация выбрасывает 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).
Parameters:
arg - аргумент для получения доступа. Это значение передаётся в tryAcquire(int), но в остальном не интерпретируется и может представлять собой что угодно.
nanosTimeout - максимальное время ожидания в наносекундах
Returns:
true если доступ получен; false если таймаут истек
Throws:
InterruptedException - если текущий поток прерван

release

public final boolean release(int arg)
Освобождение эксклюзивного доступа. Реализация включает разблокировку одного или нескольких потоков, если tryRelease(int) возвращает true. Этот метод можно использовать для реализации метода Lock.unlock().
Parameters:
arg - аргумент для освобождения доступа. Это значение передаётся в tryRelease(int), но в остальном не интерпретируется и может представлять собой что угодно.
Returns:
значение, возвращённое из tryRelease(int)

acquireShared

public final void acquireShared(int arg)
Получение доступа в режиме совместного использования, игнорируя прерывания. Реализация включает вызов tryAcquireShared(int) хотя бы один раз, возвращая результат при успехе. В противном случае поток ставится в очередь, возможно, многократно блокируется и разблокируется, вызывая tryAcquireShared(int) до получения успеха.
Parameters:
arg - аргумент для получения доступа. Это значение передаётся в tryAcquireShared(int), но в остальном не интерпретируется и может представлять собой что угодно.

acquireSharedInterruptibly

public final void acquireSharedInterruptibly(int arg) throws InterruptedException
Получение доступа в режиме совместного использования, прерывая выполнение, если поток прерван. Реализация включает проверку статуса прерывания, затем вызов tryAcquireShared(int) хотя бы один раз, возвращая результат при успехе. В противном случае поток ставится в очередь, возможно, многократно блокируется и разблокируется, вызывая tryAcquireShared(int) до получения успеха или прерывания потока.
Parameters:
arg - аргумент для получения доступа. Это значение передаётся в tryAcquireShared(int), но в остальном не интерпретируется и может представлять собой что угодно.
Throws:
InterruptedException - если текущий поток прерван

tryAcquireSharedNanos

public final boolean tryAcquireSharedNanos(int arg, long nanosTimeout) throws InterruptedException
Попытка получить доступ в режиме совместного использования, прерывая выполнение, если поток прерван, и возвращая ошибку, если заданный таймаут истек. Реализация включает проверку статуса прерывания, затем вызов tryAcquireShared(int) хотя бы один раз, возвращая результат при успехе. В противном случае поток ставится в очередь, возможно, многократно блокируется и разблокируется, вызывая tryAcquireShared(int) до получения успеха или прерывания потока, или истечения таймаута.
Parameters:
arg - аргумент для получения доступа. Это значение передаётся в tryAcquireShared(int), но в остальном не интерпретируется и может представлять собой что угодно.
nanosTimeout - максимальное время ожидания в наносекундах
Returns:
true если доступ получен; false если таймаут истек
Throws:
InterruptedException - если текущий поток прерван

releaseShared

public final boolean releaseShared(int arg)
Освобождение доступа в режиме совместного использования. Реализация включает разблокировку одного или нескольких потоков, если tryReleaseShared(int) возвращает true.
Parameters:
arg - аргумент для освобождения доступа. Это значение передаётся в tryReleaseShared(int), но в остальном не интерпретируется и может представлять собой что угодно.
Returns:
значение, возвращённое из tryReleaseShared(int)

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)
Возвращает true, если данный поток в настоящее время находится в очереди.

Эта реализация проходит по очереди для определения наличия данного потока.

Parameters:
thread - поток
Returns:
true если данный поток находится в очереди
Throws:
NullPointerException - если поток null

hasQueuedPredecessors

public final boolean hasQueuedPredecessors()
Определяет, ожидают ли какие-либо потоки получения доступа дольше, чем текущий поток.

Вызов этого метода эквивалентен (но может быть более эффективным):

 
 getFirstQueuedThread() != Thread.currentThread()
   && hasQueuedThreads()

Обратите внимание, что из-за отмены по прерываниям и таймаутам, которые могут произойти в любое время, возврат значения true не гарантирует, что какой-либо другой поток получит доступ до текущего потока. Аналогично, возможно, что другой поток выиграет гонку по добавлению в очередь после того, как этот метод вернул значение false, из-за того, что очередь пуста.

Этот метод предназначен для использования справедливым синхронизатором, чтобы избежать перехвата. Такой синхронизатор должен возвращать false в методе tryAcquire(int), и его метод 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
   }
 }
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:
коллекция потоков

getSharedQueuedThreads

public final Collection<Thread> getSharedQueuedThreads()
Возвращает коллекцию, содержащую потоки, которые могут ожидать получения доступа в режиме совместного использования. Имеет те же свойства, что и getQueuedThreads(), за исключением того, что возвращаются только те потоки, которые ожидают из-за совместного получения доступа.
Returns:
коллекция потоков

toString

public String toString()
Возвращает строку, идентифицирующую этот синхронизатор, а также его состояние. Состояние, в скобках, включает строку "State =", за которой следует текущее значение getState(), и либо "nonempty", либо "empty" в зависимости от того, пуста ли очередь.
Overrides:
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, 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.
https://download.java.net/java/early_access/jdk24/docs/api/java.base/java/util/concurrent/locks/AbstractQueuedSynchronizer.html

Spec-Zone.ru

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