Spec-Zone .ru
спецификации, руководства, описания, API
 Платформа Java™
Стандарт Эд. 7

Пакет java.util.concurrent.atomic

Маленький инструментарий классов, которые поддерживают ориентированное на многопотоковое исполнение программирование без блокировок на единственных переменных.

См.: Описание

Пакет java.util.concurrent.atomic Описание

Маленький инструментарий классов, которые поддерживают ориентированное на многопотоковое исполнение программирование без блокировок на единственных переменных. В основном классы в этом пакете расширяют понятие volatile значения, поля, и элементы массива тем, которые также обеспечивают атомарную условную работу обновления формы:
   boolean compareAndSet(expectedValue, updateValue);
 

Этот метод (который изменяется по типам параметра через различные классы) атомарно устанавливает переменную в updateValue если это в настоящий момент содержит expectedValue, создание отчетов true на успехе. Классы в этом пакете также содержат методы, чтобы получить и безоговорочно установить значения, так же как более слабую условную атомарную работу обновления weakCompareAndSet описанный ниже.

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

Экземпляры классов AtomicBoolean, AtomicInteger, AtomicLong, и AtomicReference каждый обеспечивает доступ и обновления к единственной переменной соответствующего типа. Каждый класс также обеспечивает соответствующие служебные методы для того типа. Например, классы AtomicLong и AtomicInteger обеспечьте атомарные инкрементные методы. Одно приложение должно генерировать порядковые номера, как в:

 class Sequencer {
   private final AtomicLong sequenceNumber
     = new AtomicLong(0);
   public long next() {
     return sequenceNumber.getAndIncrement();
   }
 }
 

Эффекты памяти для доступов и обновлений атомной энергетики обычно следуют за правилами для volatiles, как утверждено в разделе 17.4 из Спецификации языка Java™.

В дополнение к классам, представляющим единственные значения, этот пакет содержит классы Updater, которые могут использоваться, чтобы получить compareAndSet операции на любом выбранном volatile поле любого выбранного класса. AtomicReferenceFieldUpdater, AtomicIntegerFieldUpdater, и AtomicLongFieldUpdater основанные на отражении утилиты, которые обеспечивают доступ к связанным типам поля. Они имеют, главным образом, использование в атомарных структурах данных в который несколько volatile поля того же самого узла (например, ссылки древовидного узла) независимо подвергаются атомарным обновлениям. Эти классы включают большей гибкости в том, как и когда использовать атомарные обновления, за счет более неуклюжей основанной на отражении установки, менее удобного использования, и более слабых гарантий.

AtomicIntegerArray, AtomicLongArray, и AtomicReferenceArray классы далее расширяют атомарную поддержку работы массивам этих типов. Эти классы также известны в обеспечении volatile семантика доступа для их элементов массива, которая не поддерживается для обычных массивов.

Атомарные классы также поддерживают метод weakCompareAndSet, который ограничил применимость. На некоторых платформах слабая версия может быть более эффективной чем compareAndSet в нормальном случае, но отличается по тому любому данному вызову weakCompareAndSet метод может возвратиться false побочно (то есть, ни по какой очевидной причине). A false возвратите средства только, что работа может быть повторена при желании, полагаясь на гарантию, которая повторила вызов, когда переменная содержит expectedValue и никакой другой поток также не пытается установить переменную, в конечном счете успешно выполнится. (Такие побочные отказы могут например произойти из-за эффектов конкуренции памяти, которые не связаны с тем, равна ли ожидаемая и текущая стоимость.) Дополнительно weakCompareAndSet не обеспечивает гарантии упорядочивания, которые обычно необходимы для управления синхронизацией. Однако, метод может быть полезным для обновления счетчиков и статистики, когда такие обновления не связаны с другим, происходит - перед упорядочиваниями программы. Когда поток видит обновление к атомарной переменной, вызванной a weakCompareAndSet, это не обязательно видит обновления к любым другим переменным, которые произошли перед weakCompareAndSet. Это может быть приемлемым когда, например, обновляя статистику производительности, но редко иначе.

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

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

Атомарные классы не являются заменами общего назначения для java.lang.Integer и связанные классы. Они не определяют методы такой как hashCode и compareTo. (Поскольку атомарные переменные, как ожидают, будут видоизменены, они - плохие варианты для ключей хэш-таблицы.) Дополнительно, классы обеспечиваются только для тех типов, которые обычно полезны в применениях по назначению. Например, нет никакого атомарного класса для того, чтобы представить byte. В тех нечастых случаях, где требуется сделать так, можно использовать AtomicInteger содержать byte значения, и бросок соответственно. Можно также содержать плавающее использование Float.floatToIntBits(float) и Float.intBitsToFloat(int) преобразования, и удваивают использование Double.doubleToLongBits(double) и Double.longBitsToDouble(long) преобразования.

С тех пор:
1.5
 Платформа Java™
Стандарт Эд. 7

Представьте ошибку или функцию
Для дальнейшей ссылки API и документации разработчика, см. Java Документация SE. Та документация содержит более подробные, предназначенные разработчиком описания, с концептуальными краткими обзорами, определениями сроков, обходных решений, и рабочих примеров кода.
Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.