Пакет java.util.concurrent.atomic
Небольшой набор классов, поддерживающих потокобезопасную работу без блокировок для отдельных переменных. Экземпляры классов Atomic хранят значения, к которым осуществляется доступ и обновление с помощью методов, в противном случае доступных для полей, используя связанные атомарные VarHandle операции.
Экземпляры классов AtomicBoolean, AtomicInteger, AtomicLong и AtomicReference каждый предоставляют доступ и обновления к одной переменной соответствующего типа. Каждый класс также предоставляет соответствующие служебные методы для этого типа. Например, классы AtomicLong и AtomicInteger предоставляют атомарные методы увеличения. Одно из применений — генерация номеров последовательности, например:
class Sequencer {
private final AtomicLong sequenceNumber
= new AtomicLong(0);
public long next() {
return sequenceNumber.getAndIncrement();
}
} Произвольные преобразования содержащего значения предоставляются как с помощью низкоуровневых операций чтения-модификации-записи, таких как compareAndSet, так и с помощью методов более высокого уровня, таких как getAndUpdate.
Эти классы не являются универсальными заменам для
java.lang.Integer и родственных классов. Они не определяют методы, такие как equals, hashCode и
compareTo. Поскольку атомарные переменные предполагается изменять, они являются плохим выбором для ключей хеш-таблиц.
Классы AtomicIntegerArray, AtomicLongArray и AtomicReferenceArray дополнительно расширяют поддержку атомарных операций до массивов этих типов. Эти классы также примечательны тем, что предоставляют volatile семантику доступа к элементам массива.
Помимо классов, представляющих отдельные значения и массивы, в этом пакете содержатся классы Updater, которые могут использоваться для получения compareAndSet и связанных операций с любым выбранным volatile полем любого выбранного класса. Эти классы предшествуют представлению VarHandle и имеют более ограниченное применение. AtomicReferenceFieldUpdater, AtomicIntegerFieldUpdater и AtomicLongFieldUpdater — это основанные на рефлексии утилиты, обеспечивающие доступ к связанным типам полей. Они в основном используются в атомарных структурах данных, в которых несколько volatile полей одного узла (например, ссылки узла дерева) независимо подвергаются атомарным обновлениям. Эти классы обеспечивают большую гибкость в том, как и когда использовать атомарные обновления, ценой более громоздкой настройки, основанной на рефлексии, менее удобного использования и более слабых гарантий.
Класс AtomicMarkableReference связывает один булев со ссылкой. Например, этот бит может использоваться внутри структуры данных, чтобы означать, что объект, на который указывает ссылка, логически был удален. Класс AtomicStampedReference связывает целое значение со ссылкой. Это может использоваться, например, для представления номеров версий, соответствующих сериям обновлений.
- С момента:
- 1.5
| Класс | Описание |
|---|---|
| AtomicBoolean | Значение |
| AtomicInteger | Целочисленное значение |
| AtomicIntegerArray | Массив |
| AtomicIntegerFieldUpdater<T> | Утилита, основанная на рефлексии, которая позволяет атомарно обновлять указанные |
| AtomicLong | Значение |
| AtomicLongArray | Массив |
| AtomicLongFieldUpdater<T> | Утилита, основанная на рефлексии, которая позволяет атомарно обновлять указанные |
| AtomicMarkableReference<V> |
|
| AtomicReference<V> | Ссылка на объект, которая может быть обновлена атомарно. |
| AtomicReferenceArray<E> | Массив ссылок на объекты, в котором элементы могут быть обновлены атомарно. |
| AtomicReferenceFieldUpdater<T,V> | Утилита, основанная на рефлексии, которая позволяет атомарно обновлять указанные |
| AtomicStampedReference<V> |
|
| DoubleAccumulator | Одна или несколько переменных, которые вместе поддерживают текущее значение |
| DoubleAdder | Одна или несколько переменных, которые вместе поддерживают начальную сумму |
| LongAccumulator | Одна или несколько переменных, которые вместе поддерживают текущее значение |
| LongAdder | Одна или несколько переменных, которые вместе поддерживают начальную сумму |
© 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/atomic/package-summary.html