Spec-Zone.ru › OpenJDK 17

Класс LockSupport

java.lang.Object
java.util.concurrent.locks.LockSupport
public class LockSupport extends Object
Основные примитивы блокировки потоков для создания замков и других классов синхронизации.

Этот класс связывает с каждым использующим его потоком разрешение (в том же смысле, что и в классе Semaphore). Вызов park вернёт значение немедленно, если разрешение доступно, потребляя его в процессе; в противном случае он может заблокироваться. Вызов unpark делает разрешение доступным, если оно ещё не было доступно. (В отличие от семафоров, разрешения не накапливаются. Их может быть не более одного.) Надёжное использование требует использования переменных volatile (или атомных) для управления тем, когда нужно остановить или разблокировать поток. Порядок вызовов этих методов поддерживается относительно обращений к переменным volatile, но не обязательно к переменным, не являющимся volatile.

Методы park и unpark обеспечивают эффективный способ блокировки и разблокировки потоков, не сталкиваясь с проблемами, из-за которых устаревшие методы Thread.suspend и Thread.resume неприменимы для таких целей: гонки между одним потоком, вызывающим park, и другим потоком, пытающимся unpark его, сохранят жизнеспособность благодаря разрешению. Кроме того, park вернёт значение, если вызывающий поток был прерван, и поддерживаются версии с таймаутом. Метод park также может вернуть значение в любое другое время, без «причины», поэтому, как правило, должен вызываться в цикле, который повторно проверяет условия при возвращении. В этом смысле park служит оптимизацией «занятого ожидания», которое не тратит так много времени на прокрутку, но должно быть сопряжено с unpark для эффективности.

Все три формы park также поддерживают параметр объекта blocker. Этот объект фиксируется, пока поток заблокирован, чтобы позволить мониторинговым и диагностическим инструментам определять причины блокировки потоков. (Эти инструменты могут получить доступ к блокировщикам с помощью метода getBlocker(Thread)). Использование этих форм вместо исходных форм без этого параметра настоятельно рекомендуется. Обычно в качестве blocker в реализации замка следует передавать this.

Эти методы предназначены для использования в качестве инструментов для создания утилит синхронизации более высокого уровня и сами по себе не являются полезными для большинства приложений управления конкурентностью. Метод park предназначен для использования только в конструкциях вида:

 
 while (!canProceed()) {
   // ensure request to unpark is visible to other threads
   ...
   LockSupport.park(this);
 }
где никакие действия потока, публикующего запрос на разблокировку, до вызова park, не включают в себя блокировку или ожидание. Поскольку только одно разрешение ассоциируется с каждым потоком, любые промежуточные использования park, включая неявное через загрузку класса, могут привести к не реагирующему потоку ( «потерянное разблокирование»).

Пример использования. Вот набросок класса замка первого вошедшего - первого обслуженного, нереентерабельного:

 
 class FIFOMutex {
   private final AtomicBoolean locked = new AtomicBoolean(false);
   private final Queue<Thread> waiters
     = new ConcurrentLinkedQueue<>();

   public void lock() {
     boolean wasInterrupted = false;
     // publish current thread for unparkers
     waiters.add(Thread.currentThread());

     // Block while not first in queue or cannot acquire lock
     while (waiters.peek() != Thread.currentThread() ||
            !locked.compareAndSet(false, true)) {
       LockSupport.park(this);
       // ignore interrupts while waiting
       if (Thread.interrupted())
         wasInterrupted = true;
     }

     waiters.remove();
     // ensure correct interrupt status on return
     if (wasInterrupted)
       Thread.currentThread().interrupt();
   }

   public void unlock() {
     locked.set(false);
     LockSupport.unpark(waiters.peek());
   }

   static {
     // Reduce the risk of "lost unpark" due to classloading
     Class<?> ensureLoaded = LockSupport.class;
   }
 }
С момента:
1.5

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

Модификатор и тип Метод Описание
static Object getBlocker(Thread t)
Возвращает объект блокировщика, предоставленный в последнем вызове метода park, который ещё не разблокирован, или null, если не заблокирован.
static void park()
Отключает текущий поток для целей планирования потоков, если разрешение не доступно.
static void park(Object blocker)
Отключает текущий поток для целей планирования потоков, если разрешение не доступно.
static void parkNanos(long nanos)
Отключает текущий поток для целей планирования потоков до указанного времени ожидания, если разрешение не доступно.
static void parkNanos(Object blocker, long nanos)
Отключает текущий поток для целей планирования потоков до указанного времени ожидания, если разрешение не доступно.
static void parkUntil(long deadline)
Отключает текущий поток для целей планирования потоков до указанной даты, если разрешение не доступно.
static void parkUntil(Object blocker, long deadline)
Отключает текущий поток для целей планирования потоков до указанной даты, если разрешение не доступно.
static void setCurrentBlocker(Object blocker)
Устанавливает объект, который будет возвращён вызовами getBlocker для текущего потока.
static void unpark(Thread thread)
Делает разрешение доступным для данного потока, если оно ещё не было доступно.

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

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

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

setCurrentBlocker

public static void setCurrentBlocker(Object blocker)
Устанавливает объект, который будет возвращён вызовами getBlocker для текущего потока. Этот метод можно использовать перед вызовом версии метода park() без аргументов из объектов, не являющихся общедоступными, для получения более полезной диагностики или сохранения совместимости с предыдущими реализациями методов блокировки. Предыдущие значения блокиратора не восстанавливаются автоматически после блокировки. Чтобы получить эффект park(b}, используйте setCurrentBlocker(b); park(); setCurrentBlocker(null);
Параметры:
blocker - объект блокиратора
С:
14

unpark

public static void unpark(Thread thread)
Освобождает разрешение для данного потока, если оно ещё не было освобождено. Если поток был заблокирован на park, то он разблокируется. В противном случае следующий вызов потока к park гарантированно не будет заблокирован. Эта операция не гарантирует никакого эффекта, если данный поток ещё не запущен.
Параметры:
thread - поток для разблокировки, или null, в этом случае операция не имеет эффекта

park

public static void park(Object blocker)
Отключает текущий поток для целей планирования потоков, если разрешение не доступно.

Если разрешение доступно, оно потребляется, и вызов возвращается немедленно; в противном случае текущий поток отключается для целей планирования потоков и находится в спящем состоянии, пока не произойдёт одно из трёх событий:

  • Другой поток вызывает unpark с текущим потоком в качестве целевого потока; или
  • Другой поток прерывает текущий поток; или
  • Вызов возвращается по случайному (т.е. без причины) событию.

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

Параметры:
blocker - объект синхронизации, ответственный за приостановку этого потока
С:
1.6

parkNanos

public static void parkNanos(Object blocker, long nanos)
Отключает текущий поток для целей планирования потоков на указанное время ожидания, если разрешение не доступно.

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

  • Другой поток вызывает unpark с текущим потоком в качестве целевого потока; или
  • Другой поток прерывает текущий поток; или
  • Указанное время ожидания истекает; или
  • Вызов возвращается по случайному (т.е. без причины) событию.

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

Параметры:
blocker - объект синхронизации, ответственный за приостановку этого потока
nanos - максимальное число наносекунд ожидания
С:
1.6

parkUntil

public static void parkUntil(Object blocker, long deadline)
Отключает текущий поток для целей планирования потоков до указанного крайнего срока, если разрешение не доступно.

Если разрешение доступно, оно потребляется, и вызов возвращается немедленно; в противном случае текущий поток отключается для целей планирования потоков и находится в спящем состоянии, пока не произойдёт одно из четырёх событий:

  • Другой поток вызывает unpark с текущим потоком в качестве целевого потока; или
  • Другой поток прерывает текущий поток; или
  • Установленный крайний срок истекает; или
  • Вызов возвращается по случайному (т.е. без причины) событию.

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

Параметры:
blocker - объект синхронизации, ответственный за приостановку этого потока
deadline - абсолютное время в миллисекундах с эпохи, до которого ожидать
С:
1.6

getBlocker

public static Object getBlocker(Thread t)
Возвращает объект блокиратора, предоставленный в последнем вызове метода park, который ещё не разблокирован, или null, если поток не заблокирован. Возвращаемое значение представляет собой лишь мгновенный снимок — поток может с тех пор разблокироваться или заблокироваться на другом объекте блокиратора.
Параметры:
t - поток
Возвращает:
объект блокиратора
Исключения:
NullPointerException - если аргумент равен null
С:
1.6

park

public static void park()
Отключает текущий поток для целей планирования потоков, если разрешение не доступно.

Если разрешение доступно, оно потребляется, и вызов возвращается немедленно; в противном случае текущий поток отключается для целей планирования потоков и находится в спящем состоянии, пока не произойдёт одно из трёх событий:

  • Другой поток вызывает unpark с текущим потоком в качестве целевого потока; или
  • Другой поток прерывает текущий поток; или
  • Вызов возвращается по случайному (т.е. без причины) событию.

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

parkNanos

public static void parkNanos(long nanos)
Отключает текущий поток для целей планирования потоков на указанное время ожидания, если разрешение не доступно.

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

  • Другой поток вызывает unpark с текущим потоком в качестве целевого потока; или
  • Другой поток прерывает текущий поток; или
  • Указанное время ожидания истекает; или
  • Вызов возвращается по случайному (т.е. без причины) событию.

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

Параметры:
nanos - максимальное число наносекунд ожидания

parkUntil

public static void parkUntil(long deadline)
Отключает текущий поток для целей планирования потоков до указанного крайнего срока, если разрешение не доступно.

Если разрешение доступно, оно потребляется, и вызов возвращается немедленно; в противном случае текущий поток отключается для целей планирования потоков и находится в спящем состоянии, пока не произойдёт одно из четырёх событий:

  • Другой поток вызывает unpark с текущим потоком в качестве целевого потока; или
  • Другой поток прерывает текущий поток; или
  • Установленный крайний срок истекает; или
  • Вызов возвращается по случайному (т.е. без причины) событию.

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

Параметры:
deadline - абсолютное время в миллисекундах с эпохи, до которого ожидать

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

Spec-Zone.ru

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