Класс LockSupport
- java.lang.Object
-
- java.util.concurrent.locks.LockSupport
public class LockSupport extends Object
Основные примитивы блокировки потоков для создания замков и других классов синхронизации.
Этот класс ассоциирует с каждым использующим его потоком разрешение (в смысле класса Semaphore). Вызов park вернёт результат немедленно, если разрешение доступно, потребляя его в процессе; иначе он может заблокироваться. Вызов unpark делает разрешение доступным, если оно ещё не было доступно. (В отличие от семафоров, разрешения не накапливаются. Их может быть не более одного.)
Методы park и unpark обеспечивают эффективный способ блокировки и разблокировки потоков, не сталкиваясь с проблемами, из-за которых устаревшие методы Thread.suspend и Thread.resume непригодны для таких целей: гонки между одним потоком, вызывающим park, и другим потоком, пытающимся unpark его, сохранят жизнеспособность благодаря разрешению. Кроме того, park вернёт результат, если вызывающий поток был прерван, и поддерживаются варианты с таймаутом. Метод park также может вернуть результат в любое другое время, без видимой причины, поэтому в целом его необходимо вызывать в цикле, который перепроверяет условия после возврата. В этом смысле park служит оптимизацией «занятого ожидания», которое не тратит так много времени на вращение, но должно быть дополнено unpark для эффективности.
Все три формы park также поддерживают параметр объекта blocker. Этот объект записывается, пока поток заблокирован, чтобы позволить средствам мониторинга и диагностики определить причины блокировки потоков. (Эти средства могут получить доступ к блокировщикам, используя метод getBlocker(Thread).) Сильно рекомендуется использовать эти формы вместо исходных форм без этого параметра. Обычным аргументом для предоставления в реализации замка является this.
Эти методы предназначены для использования в качестве инструментов для создания утилит синхронизации более высокого уровня и сами по себе не полезны для большинства задач управления конкурентностью. Метод park предназначен для использования только в конструкциях следующего вида:
while (!canProceed()) { ... LockSupport.park(this); } где ни canProceed ни любые другие действия до вызова park не предполагают блокировку или ожидание. Поскольку с каждым потоком ассоциируется только одно разрешение, любые промежуточные использования park могут повлиять на предполагаемый эффект. Пример использования. Вот эскиз класса нереентерабельного замка FIFO:
class FIFOMutex {
private final AtomicBoolean locked = new AtomicBoolean(false);
private final Queue<Thread> waiters
= new ConcurrentLinkedQueue<Thread>();
public void lock() {
boolean wasInterrupted = false;
Thread current = Thread.currentThread();
waiters.add(current);
// Block while not first in queue or cannot acquire lock
while (waiters.peek() != current ||
!locked.compareAndSet(false, true)) {
LockSupport.park(this);
if (Thread.interrupted()) // ignore interrupts while waiting
wasInterrupted = true;
}
waiters.remove();
if (wasInterrupted) // reassert interrupt status on exit
current.interrupt();
}
public void unlock() {
locked.set(false);
LockSupport.unpark(waiters.peek());
}
}
Методы
| Модификатор и тип | Метод и описание |
|---|---|
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 |
unpark(Thread thread) Делает разрешение доступным для заданного потока, если оно ещё не было доступно. |
Методы, унаследованные от класса java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait Методы
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, 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.