Класс AbstractQueuedSynchronizer

Все реализуемые интерфейсы:
Serializable
public abstract class AbstractQueuedSynchronizer
extends AbstractOwnableSynchronizer
implements Serializable

Предоставляет фреймворк для реализации блокирующих замков и связанных синхронизаторов (семафоры, события и т. д.), которые полагаются на очереди ожидания FIFO (первым вошел — первым вышел). Этот класс разработан как полезная основа для большинства видов синхронизаторов, которые полагаются на единственное атомное int значение для представления состояния. Подклассы должны определить защищённые методы, которые изменяют это состояние и определяют, что означает это состояние в терминах приобретения или освобождения этого объекта. Учитывая это, другие методы в этом классе выполняют все механизмы очереди и блокировки. Подклассы могут поддерживать другие поля состояния, но только атомарно обновлённое int значение, изменённое с помощью методов getState(), setState(int) и compareAndSetState(int, int), отслеживается в отношении синхронизации.

Подклассы должны быть определены как внутренние вспомогательные классы, которые используются для реализации свойств синхронизации их содержащего класса. Класс AbstractQueuedSynchronizer не реализует ни один интерфейс синхронизации. Вместо этого он определяет методы, такие как acquireInterruptibly(int), которые могут быть вызваны соответствующим образом конкретными замками и связанными синхронизаторами для реализации их публичных методов.

Этот класс поддерживает либо режим по умолчанию исключительный, либо режим совместный. При приобретении в режиме исключения попытки приобретения другими потоками не могут увенчаться успехом. Приобретения в режиме совместного использования несколькими потоками могут (но необязательно) увенчаться успехом. Этот класс не «понимает» эти различия, за исключением механического смысла, что когда приобретение в режиме совместного использования успешно, следующий ожидающий поток (если он есть) также должен определить, может ли он приобрести. Потоки, ожидающие в разных режимах, используют одну и ту же очередь FIFO. Обычно подклассы реализации поддерживают только один из этих режимов, но оба могут вступать в игру, например, в ReadWriteLock. Подклассы, поддерживающие только исключительный или только совместный режимы, не обязаны определять методы, поддерживающие неиспользуемый режим.

Этот класс определяет вложенный класс AbstractQueuedSynchronizer.ConditionObject, который может использоваться как реализация Condition подклассами, поддерживающими режим исключения, для которых метод isHeldExclusively() сообщает, заблокирована ли синхронизация исключительно текущим потоком, метод release(int), вызываемый с текущим значением getState(), полностью освобождает этот объект, и acquire(int), учитывая это сохранённое значение состояния, в конечном итоге восстанавливает этот объект до его предыдущего состояния приобретения. Никакой AbstractQueuedSynchronizer метод иначе не создаёт такое условие, поэтому, если это ограничение не может быть выполнено, не используйте его. Поведение AbstractQueuedSynchronizer.ConditionObject зависит, конечно, от семантики реализации его синхронизатора.

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

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

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

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

Каждый из этих методов по умолчанию выбрасывает UnsupportedOperationException. Реализации этих методов должны быть внутренне потокобезопасными и в общем случае должны быть короткими и не блокировать. Определение этих методов — единственный поддерживаемый способ использования этого класса. Все остальные методы объявлены final , так как они не могут быть независимо изменены.

Вы также можете найти полезными унаследованные методы от AbstractOwnableSynchronizer, чтобы отслеживать поток, владеющий исключительным синхронизатором. Рекомендуется использовать их — это позволяет инструментам мониторинга и диагностики помогать пользователям определять, какие потоки владеют замками.

Несмотря на то, что этот класс основан на внутренней очереди FIFO, он не автоматически применяет политики приобретения FIFO. Ядро исключительной синхронизации выглядит следующим образом:

Acquire:
     while (!tryAcquire(arg)) {
        enqueue thread if it is not already queued;
        possibly block current thread;
     }

 Release:
     if (tryRelease(arg))
        unblock the first queued thread;
(Режим совместного использования аналогичен, но может включать каскадные сигналы.)

Поскольку проверки в acquire вызываются до помещения в очередь, новый приобретающий поток может вклиниться вперёд других заблокированных и помещённых в очередь. Однако, если необходимо, вы можете определить tryAcquire и/или tryAcquireShared , чтобы отключить вклинивание, вызвав внутри один или несколько методов инспекции, тем самым обеспечив честную политику приобретения FIFO. В частности, большинство честных синхронизаторов могут определить tryAcquire , чтобы вернуть false , если hasQueuedPredecessors() (метод, специально предназначенный для использования честными синхронизаторами) возвращает true. Другие варианты возможны.

Производительность и масштабируемость обычно выше для стратегии вклинивания по умолчанию (также известной как жадная, отказная и избегающая конвоя). Хотя это не гарантирует справедливости или отсутствия голодания, ожидающие ранее потоки получают возможность повторного участия в борьбе за ресурс перед потоками, помещёнными в очередь позже, и каждое такое участие имеет беспристрастный шанс одержать победу над входящими потоками. Кроме того, хотя приобретения не «вращаются» в обычном смысле, они могут выполнять несколько вызовов tryAcquire между другими вычислениями перед блокировкой. Это даёт большинство преимуществ вращений, когда исключительная синхронизация удерживается только на короткое время, без большинства недостатков, когда этого нет. При желании вы можете дополнить это, предваряя вызовы методов приобретения «проверками быстрого пути», возможно, предварительно проверяя hasContended() и/или hasQueuedThreads(), чтобы делать это только в том случае, если синхронизатор, вероятно, не будет конкурировать.

Этот класс обеспечивает эффективную и масштабируемую основу для синхронизации, отчасти специализируясь на синхронизаторах, которые могут полагаться на int состояние, параметры приобретения и освобождения, и внутреннюю очередь ожидания FIFO. Когда этого недостаточно, вы можете создавать синхронизаторы на более низком уровне, используя классы atomic, собственные пользовательские классы очереди Queue и поддержку блокировки LockSupport.

Примеры использования

Вот класс нерекурсивного взаимного исключения, который использует значение ноль для представления разблокированного состояния и единицу для представления заблокированного состояния. Хотя для нерекурсивного замка строго не требуется регистрация текущего владельца потока, этот класс делает это для упрощения мониторинга использования. Он также поддерживает условия и предоставляет некоторые методы инструментирования:

class Mutex implements Lock, java.io.Serializable {

   // Our internal helper class
   private static class Sync extends AbstractQueuedSynchronizer {
     // Acquires the lock if state is zero
     public boolean tryAcquire(int acquires) {
       assert acquires == 1; // Otherwise unused
       if (compareAndSetState(0, 1)) {
         setExclusiveOwnerThread(Thread.currentThread());
         return true;
       }
       return false;
     }

     // Releases the lock by setting state to zero
     protected boolean tryRelease(int releases) {
       assert releases == 1; // Otherwise unused
       if (!isHeldExclusively())
         throw new IllegalMonitorStateException();
       setExclusiveOwnerThread(null);
       setState(0);
       return true;
     }

     // Reports whether in locked state
     public boolean isLocked() {
       return getState() != 0;
     }

     public boolean isHeldExclusively() {
       // a data race, but safe due to out-of-thin-air guarantees
       return getExclusiveOwnerThread() == Thread.currentThread();
     }

     // Provides a Condition
     public Condition newCondition() {
       return new ConditionObject();
     }

     // Deserializes properly
     private void readObject(ObjectInputStream s)
         throws IOException, ClassNotFoundException {
       s.defaultReadObject();
       setState(0); // reset to unlocked state
     }
   }

   // The sync object does all the hard work. We just forward to it.
   private final Sync sync = new Sync();

   public void lock()              { sync.acquire(1); }
   public boolean tryLock()        { return sync.tryAcquire(1); }
   public void unlock()            { sync.release(1); }
   public Condition newCondition() { return sync.newCondition(); }
   public boolean isLocked()       { return sync.isLocked(); }
   public boolean isHeldByCurrentThread() {
     return sync.isHeldExclusively();
   }
   public boolean hasQueuedThreads() {
     return sync.hasQueuedThreads();
   }
   public void lockInterruptibly() throws InterruptedException {
     sync.acquireInterruptibly(1);
   }
   public boolean tryLock(long timeout, TimeUnit unit)
       throws InterruptedException {
     return sync.tryAcquireNanos(1, unit.toNanos(timeout));
   }
 }

Вот класс счётчика, похожий на CountDownLatch, за исключением того, что ему требуется только один signal для срабатывания. Поскольку счётчик не является исключительным, он использует методы приобретения и освобождения shared.

class BooleanLatch {

   private static class Sync extends AbstractQueuedSynchronizer {
     boolean isSignalled() { return getState() != 0; }

     protected int tryAcquireShared(int ignore) {
       return isSignalled() ? 1 : -1;
     }

     protected boolean tryReleaseShared(int ignore) {
       setState(1);
       return true;
     }
   }

   private final Sync sync = new Sync();
   public boolean isSignalled() { return sync.isSignalled(); }
   public void signal()         { sync.releaseShared(1); }
   public void await() throws InterruptedException {
     sync.acquireSharedInterruptibly(1);
   }
 }
С:
1.5
См. также:
Формат сериализации

Вложенные классы

Модификатор и тип Класс Описание
class  AbstractQueuedSynchronizer.ConditionObject

Реализация условия для AbstractQueuedSynchronizer, служащей основой для реализации Lock.

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

Модификатор Конструктор Описание
protected AbstractQueuedSynchronizer()

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

Методы

Модификатор и тип Метод Описание
void acquire​(int arg)

Приобретает в эксклюзивном режиме, игнорируя прерывания.

void acquireInterruptibly​(int arg)

Приобретает в эксклюзивном режиме, прерываясь при прерывании.

void acquireShared​(int arg)

Приобретает в совместном режиме, игнорируя прерывания.

void acquireSharedInterruptibly​(int arg)

Приобретает в совместном режиме, прерываясь при прерывании.

protected boolean compareAndSetState​(int expect, int update)

Атомарно устанавливает состояние синхронизации на заданное обновлённое значение, если текущее значение состояния равно ожидаемому значению.

Collection<Thread> getExclusiveQueuedThreads()

Возвращает коллекцию, содержащую потоки, которые могут ожидать приобретения в эксклюзивном режиме.

Thread getFirstQueuedThread()

Возвращает первый (самый долго ожидающий) поток в очереди или null если в очереди нет потоков.

Collection<Thread> getQueuedThreads()

Возвращает коллекцию, содержащую потоки, которые могут ожидать приобретения.

int getQueueLength()

Возвращает оценку количества потоков, ожидающих приобретения.

Collection<Thread> getSharedQueuedThreads()

Возвращает коллекцию, содержащую потоки, которые могут ожидать приобретения в совместном режиме.

protected int getState()

Возвращает текущее значение состояния синхронизации.

Collection<Thread> getWaitingThreads​(AbstractQueuedSynchronizer.ConditionObject condition)

Возвращает коллекцию, содержащую потоки, которые могут ожидать на заданном условии, связанном с этим синхронизатором.

int getWaitQueueLength​(AbstractQueuedSynchronizer.ConditionObject condition)

Возвращает оценку количества потоков, ожидающих на заданном условии, связанном с этим синхронизатором.

boolean hasContended()

Запрашивает, сталкивались ли когда-либо потоки при приобретении этого синхронизатора; то есть, блокировался ли когда-либо метод приобретения.

boolean hasQueuedPredecessors()

Запрашивает, ожидают ли какие-либо потоки приобретения дольше текущего потока.

boolean hasQueuedThreads()

Запрашивает, ожидают ли какие-либо потоки приобретения.

boolean hasWaiters​(AbstractQueuedSynchronizer.ConditionObject condition)

Запрашивает, ожидают ли какие-либо потоки на заданном условии, связанном с этим синхронизатором.

protected boolean isHeldExclusively()

Возвращает true если синхронизация удерживается исключительно относительно текущего (вызывающего) потока.

boolean isQueued​(Thread thread)

Возвращает true, если данный поток в настоящее время находится в очереди.

boolean owns​(AbstractQueuedSynchronizer.ConditionObject condition)

Запрашивает, использует ли данный ConditionObject этот синхронизатор в качестве своего замка.

boolean release​(int arg)

Освобождает в эксклюзивном режиме.

boolean releaseShared​(int arg)

Освобождает в совместном режиме.

protected void setState​(int newState)

Устанавливает значение состояния синхронизации.

String toString()

Возвращает строку, идентифицирующую этот синхронизатор, а также его состояние.

protected boolean tryAcquire​(int arg)

Попытка приобрести в эксклюзивном режиме.

boolean tryAcquireNanos​(int arg, long nanosTimeout)

Попытка приобрести в эксклюзивном режиме, прерываясь при прерывании и отказываясь, если истечёт заданный таймаут.

protected int tryAcquireShared​(int arg)

Попытка приобрести в совместном режиме.

boolean tryAcquireSharedNanos​(int arg, long nanosTimeout)

Попытка приобрести в совместном режиме, прерываясь при прерывании и отказываясь, если истечёт заданный таймаут.

protected boolean tryRelease​(int arg)

Попытка установить состояние, отражающее освобождение в эксклюзивном режиме.

protected boolean tryReleaseShared​(int arg)

Попытка установить состояние, отражающее освобождение в совместном режиме.

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

getExclusiveOwnerThread, setExclusiveOwnerThread

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

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

Конструкторы

AbstractQueuedSynchronizer

protected AbstractQueuedSynchronizer()

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

Методы

getState

protected final int getState()

Возвращает текущее значение состояния синхронизации. Данная операция имеет семантику памяти volatile чтения.

Возвращает:
текущее значение состояния

setState

protected final void setState(int newState)

Устанавливает значение состояния синхронизации. Данная операция имеет семантику памяти volatile записи.

Параметры:
newState - новое значение состояния

compareAndSetState

protected final boolean compareAndSetState(int expect,
                                           int update)

Атомарно устанавливает состояние синхронизации на заданное обновленное значение, если текущее значение состояния равно ожидаемому значению. Данная операция имеет семантику памяти volatile чтения и записи.

Параметры:
expect - ожидаемое значение
update - новое значение
Возвращает:
true в случае успеха. Возвращение False указывает, что фактическое значение не было равно ожидаемому значению.

tryAcquire

protected boolean tryAcquire(int arg)

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

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

Реализация по умолчанию выбрасывает UnsupportedOperationException.

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

tryRelease

protected boolean tryRelease(int arg)

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

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

Реализация по умолчанию выбрасывает UnsupportedOperationException.

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

tryAcquireShared

protected int tryAcquireShared(int arg)

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

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

Реализация по умолчанию выбрасывает UnsupportedOperationException.

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

tryReleaseShared

protected boolean tryReleaseShared(int arg)

Попытка установить состояние, отражающее освобождение в режиме совместного доступа.

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

Реализация по умолчанию выбрасывает UnsupportedOperationException.

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

isHeldExclusively

protected boolean isHeldExclusively()

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

Реализация по умолчанию выбрасывает UnsupportedOperationException. Этот метод вызывается только внутри методов AbstractQueuedSynchronizer.ConditionObject, поэтому его не нужно определять, если условия не используются.

Возвращает:
true если синхронизация удерживается эксклюзивно; false в противном случае
Исключения:
UnsupportedOperationException - если условия не поддерживаются

acquire

public final void acquire(int arg)

Приобретает в режиме эксклюзивного доступа, игнорируя прерывания. Реализуется путем вызова по крайней мере один раз tryAcquire(int), возвращаясь при успехе. В противном случае поток ставится в очередь, возможно, многократно блокируется и разблокируется, вызывая tryAcquire(int) до успеха. Этот метод можно использовать для реализации метода Lock.lock().

Параметры:
arg - аргумент приобретения. Это значение передается в tryAcquire(int), но в противном случае не интерпретируется и может представлять собой что угодно.

acquireInterruptibly

public final void acquireInterruptibly(int arg)
                                throws InterruptedException

Приобретает в режиме эксклюзивного доступа, прерывая, если поток прерван. Реализуется путем проверки статуса прерывания, затем вызова по крайней мере один раз tryAcquire(int), возвращаясь при успехе. В противном случае поток ставится в очередь, возможно, многократно блокируется и разблокируется, вызывая tryAcquire(int) до успеха или прерывания потока. Этот метод можно использовать для реализации метода Lock.lockInterruptibly().

Параметры:
arg - аргумент приобретения. Это значение передается в tryAcquire(int), но в противном случае не интерпретируется и может представлять собой что угодно.
Исключения:
InterruptedException - если текущий поток прерван

tryAcquireNanos

public final boolean tryAcquireNanos(int arg,
                                     long nanosTimeout)
                              throws InterruptedException

Попытка приобретения в режиме эксклюзивного доступа, прерывание, если поток прерван, и отказ, если заданный таймаут истекает. Реализуется путем проверки статуса прерывания, затем вызова по крайней мере один раз tryAcquire(int), возвращаясь при успехе. В противном случае поток ставится в очередь, возможно, многократно блокируется и разблокируется, вызывая tryAcquire(int) до успеха, прерывания потока или истечения таймаута. Этот метод можно использовать для реализации метода Lock.tryLock(long, TimeUnit).

Параметры:
arg - аргумент приобретения. Это значение передается в tryAcquire(int), но в противном случае не интерпретируется и может представлять собой что угодно.
nanosTimeout - максимальное количество наносекунд ожидания
Возвращает:
true если приобретено; false если таймаут истек
Исключения:
InterruptedException - если текущий поток прерван

release

public final boolean release(int arg)

Освобождает в режиме эксклюзивного доступа. Реализуется путем разблокировки одного или нескольких потоков, если tryRelease(int) возвращает true. Этот метод можно использовать для реализации метода Lock.unlock().

Параметры:
arg - аргумент освобождения. Это значение передается в tryRelease(int), но в противном случае не интерпретируется и может представлять собой что угодно.
Возвращает:
значение, возвращаемое из tryRelease(int)

acquireShared

public final void acquireShared(int arg)

Приобретает в режиме совместного доступа, игнорируя прерывания. Реализуется путем вызова по крайней мере один раз tryAcquireShared(int), возвращаясь при успехе. В противном случае поток ставится в очередь, возможно, многократно блокируется и разблокируется, вызывая tryAcquireShared(int) до успеха.

Параметры:
arg - аргумент приобретения. Это значение передается в tryAcquireShared(int), но в противном случае не интерпретируется и может представлять собой что угодно.

acquireSharedInterruptibly

public final void acquireSharedInterruptibly(int arg)
                                      throws InterruptedException

Приобретает в режиме совместного доступа, прерывая выполнение, если произошёл перерыв. Реализуется сначала проверкой состояния прерывания, затем вызовом как минимум один раз tryAcquireShared(int), возвращая результат при успехе. В противном случае поток помещается в очередь, возможно многократно блокируется и разблокируется, вызывая tryAcquireShared(int), пока не произойдёт успех или поток не будет прерван.

Параметры:
arg — аргумент приобретения. Это значение передаётся в tryAcquireShared(int), но в противном случае не интерпретируется и может представлять собой что угодно.
Исключения:
InterruptedException — если текущий поток прерван

tryAcquireSharedNanos

public final boolean tryAcquireSharedNanos(int arg,
                                           long nanosTimeout)
                                    throws InterruptedException

Пытается приобрести в режиме совместного доступа, прерывая выполнение, если произошёл перерыв, и терпит неудачу, если истекает заданный таймаут. Реализуется сначала проверкой состояния прерывания, затем вызовом как минимум один раз tryAcquireShared(int), возвращая результат при успехе. В противном случае поток помещается в очередь, возможно многократно блокируется и разблокируется, вызывая tryAcquireShared(int), пока не произойдёт успех, поток не будет прерван или не истечёт таймаут.

Параметры:
arg — аргумент приобретения. Это значение передаётся в tryAcquireShared(int), но в противном случае не интерпретируется и может представлять собой что угодно.
nanosTimeout — максимальное количество наносекунд ожидания
Возвращает:
true если приобретено; false если таймаут истек
Исключения:
InterruptedException — если текущий поток прерван

releaseShared

public final boolean releaseShared(int arg)

Освобождает в режиме совместного доступа. Реализуется разблокировкой одного или нескольких потоков, если tryReleaseShared(int) возвращает true.

Параметры:
arg — аргумент освобождения. Это значение передаётся в tryReleaseShared(int), но в противном случае не интерпретируется и может представлять собой что угодно.
Возвращает:
значение, возвращённое из tryReleaseShared(int)

hasQueuedThreads

public final boolean hasQueuedThreads()

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

Возвращает:
true если могут ожидать другие потоки приобретения

hasContended

public final boolean hasContended()

Опрашивает, сталкивались ли когда-либо какие-либо потоки за приобретение этого синхронизатора; то есть, если метод приобретения когда-либо блокировался.

В этой реализации этот оператор возвращает результат за постоянное время.

Возвращает:
true если когда-либо была борьба за приобретение

getFirstQueuedThread

public final Thread getFirstQueuedThread()

Возвращает первый (самый долго ожидающий) поток в очереди или null если в настоящее время в очереди нет потоков.

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

Возвращает:
первый (самый долго ожидающий) поток в очереди или null если в настоящее время в очереди нет потоков

isQueued

public final boolean isQueued(Thread thread)

Возвращает true, если заданный поток в настоящее время находится в очереди.

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

Параметры:
thread — поток
Возвращает:
true если заданный поток находится в очереди
Исключения:
NullPointerException — если поток равен null

hasQueuedPredecessors

public final boolean hasQueuedPredecessors()

Опрашивает, ожидают ли какие-либо потоки приобретения дольше, чем текущий поток.

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

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

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

Этот метод предназначен для использования справедливым синхронизатором, чтобы избежать барджинга. Метод tryAcquire(int) такого синхронизатора должен возвращать false, а его метод tryAcquireShared(int) должен возвращать отрицательное значение, если этот метод возвращает true (если это не повторное приобретение). Например, метод tryAcquire для справедливого, повторного, синхронизатора в режиме эксклюзивного доступа может выглядеть так:

protected boolean tryAcquire(int arg) {
   if (isHeldExclusively()) {
     // A reentrant acquire; increment hold count
     return true;
   } else if (hasQueuedPredecessors()) {
     return false;
   } else {
     // try to acquire normally
   }
 }
Возвращает:
true если в очереди есть поток, предшествующий текущему потоку, и false если текущий поток находится в начале очереди или очередь пуста
С:
1.7

getQueueLength

public final int getQueueLength()

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

Возвращает:
приблизительное количество потоков, ожидающих приобретения

getQueuedThreads

public final Collection<Thread> getQueuedThreads()

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

Возвращает:
коллекция потоков

getExclusiveQueuedThreads

public final Collection<Thread> getExclusiveQueuedThreads()

Возвращает коллекцию, содержащую потоки, которые могут ожидать приобретения в эксклюзивном режиме. У него те же свойства, что и getQueuedThreads(), за исключением того, что он возвращает только те потоки, которые ожидают из-за эксклюзивного приобретения.

Возвращает:
коллекция потоков

getSharedQueuedThreads

public final Collection<Thread> getSharedQueuedThreads()

Возвращает коллекцию, содержащую потоки, которые могут ожидать приобретения в режиме совместного доступа. У него те же свойства, что и getQueuedThreads(), за исключением того, что он возвращает только те потоки, которые ожидают из-за совместного приобретения.

Возвращает:
коллекция потоков

toString

public String toString()

Возвращает строку, идентифицирующую этот синхронизатор, а также его состояние. Состояние в скобках включает строку "State =" за которой следует текущее значение getState(), и либо "nonempty" или "empty" в зависимости от того, пуста ли очередь.

Переопределяет:
toString в классе Object
Возвращает:
строка, идентифицирующая этот синхронизатор, а также его состояние

owns

public final boolean owns(AbstractQueuedSynchronizer.ConditionObject condition)

Опрашивает, использует ли заданный ConditionObject этот синхронизатор в качестве своего замка.

Параметры:
condition — условие
Возвращает:
true если принадлежит
Исключения:
NullPointerException — если условие равно null

hasWaiters

public final boolean hasWaiters(AbstractQueuedSynchronizer.ConditionObject condition)

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

Параметры:
condition — условие
Возвращает:
true если есть ожидающие потоки
Исключения:
IllegalMonitorStateException — если эксклюзивная синхронизация не удерживается
IllegalArgumentException — если данное условие не связано с этим синхронизатором
NullPointerException — если условие равно null

getWaitQueueLength

public final int getWaitQueueLength(AbstractQueuedSynchronizer.ConditionObject condition)

Возвращает приблизительное количество потоков, ожидающих на заданном условии, связанном с этим синхронизатором. Обратите внимание, что из-за таймаутов и прерываний, которые могут произойти в любое время, оценка служит только верхней границей фактического количества ожидающих. Этот метод предназначен для использования при мониторинге состояния системы, а не для управления синхронизацией.

Параметры:
condition — условие
Возвращает:
приблизительное количество ожидающих потоков
Исключения:
IllegalMonitorStateException — если эксклюзивная синхронизация не удерживается
IllegalArgumentException — если данное условие не связано с этим синхронизатором
NullPointerException — если условие равно null

getWaitingThreads

public final Collection<Thread> getWaitingThreads(AbstractQueuedSynchronizer.ConditionObject condition)

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

Параметры:
condition — условие
Возвращает:
коллекция потоков
Исключения:
IllegalMonitorStateException — если эксклюзивная синхронизация не удерживается
IllegalArgumentException — если данное условие не связано с этим синхронизатором
NullPointerException — если условие равно null

© 1993, 2020, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/locks/AbstractQueuedSynchronizer.html

Spec-Zone .ru
спецификации, руководства, описания, API