Spec-Zone.ru › OpenJDK 25

Класс VarHandle

java.lang.Object
java.lang.invoke.VarHandle
Все реализуемые интерфейсы:
Constable
public abstract sealed class VarHandle extends Object implements Constable
VarHandle — это динамически типизированная ссылка на переменную либо на параметрически определённое семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи. Доступ к таким переменным поддерживается в различных режимах доступа, включая обычный доступ для чтения/записи, доступ для чтения/записи с семантикой volatile и compare-and-set.

VarHandle неизменяемы и не имеют видимого состояния. Пользователь не может создавать подклассы VarHandle.

VarHandle имеет:

  • variable type T — тип каждой переменной, на которую ссылается данный VarHandle; и
  • список coordinate types CT1, CT2, ..., CTn — типы координатных выражений, которые совместно указывают на переменную, на которую ссылается данный VarHandle.
Типы переменных и координат могут быть примитивными или ссылочными и представлены объектами Class. Список типов координат может быть пустым.

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

Каждому режиму доступа соответствует один метод режима доступа — метод с полиморфной сигнатурой, названный в соответствии с режимом доступа. При вызове метода режима доступа для экземпляра VarHandle начальные аргументы вызова представляют собой координатные выражения, указывающие, к какому именно объекту следует получить доступ для обращения к переменной. Последующие аргументы вызова представляют значения, важные для режима доступа. Например, для различных режимов compare-and-set или compare-and-exchange требуются два последующих аргумента: ожидаемое и новое значения переменной.

Количество и типы аргументов вызова метода режима доступа не проверяются статически. Вместо этого каждый метод режима доступа задаёт access mode type, представленный экземпляром MethodType, который служит своего рода сигнатурой метода для динамической проверки аргументов. Тип режима доступа задаёт типы формальных параметров через типы координат экземпляра VarHandle и типы значений, важных для режима доступа. Тип режима доступа также задаёт тип возвращаемого значения, часто через тип переменной экземпляра VarHandle. При вызове метода режима доступа для экземпляра VarHandle символьный дескриптор типа в точке вызова, типы аргументов вызова во время выполнения и тип возвращаемого значения должны соответствовать типам, заданным в типе режима доступа. Если соответствие не найдено, будет выброшено исключение времени выполнения. Например, метод режима доступа compareAndSet(Object...) задаёт, что если его получатель — экземпляр VarHandle с типами координат CT1, ..., CTn и типом переменной T, то его тип режима доступа — (CT1 c1, ..., CTn cn, T expectedValue, T newValue)boolean. Предположим, что экземпляр VarHandle может обращаться к элементам массива, а его типы координат — String[] и int, а тип переменной — String. Типом режима доступа для compareAndSet у этого экземпляра VarHandle будет (String[] c1, int c2, String expectedValue, String newValue)boolean. Такой экземпляр VarHandle можно создать с помощью метода array factory method и обращаться с его помощью к элементам массива следующим образом:

String[] sa = ...
VarHandle avh = MethodHandles.arrayElementVarHandle(String[].class);
boolean r = avh.compareAndSet(sa, 10, "expected", "new");

Режимы доступа определяют свойства атомарности и согласованности. Обычные операции чтения (get) и записи (set) гарантированно атомарны на уровне битов только для ссылок и примитивных значений размером не более 32 бит и не накладывают наблюдаемых ограничений на порядок выполнения относительно потоков, отличных от выполняющего потока. Непрозрачные операции атомарны на уровне битов и упорядочены согласованно относительно обращений к той же переменной. Помимо соблюдения свойств непрозрачного режима, чтения в режиме Acquire и последующие за ними обращения упорядочиваются после соответствующих записей в режиме Release и предыдущих обращений к ним. Помимо соблюдения свойств режимов Acquire и Release, все операции Volatile упорядочены относительно друг друга в едином порядке.

Режимы доступа сгруппированы по следующим категориям:

  • режимы доступа для чтения, получающие значение переменной с заданными эффектами упорядочения памяти. Набор соответствующих методов режима доступа в этой группе состоит из методов get, getVolatile, getAcquire, getOpaque.
  • режимы доступа для записи, устанавливающие значение переменной с заданными эффектами упорядочения памяти. Набор соответствующих методов режима доступа в этой группе состоит из методов set, setVolatile, setRelease, setOpaque.
  • режимы атомарного обновления, например атомарно сравнивающие и устанавливающие значение переменной с заданными эффектами упорядочения памяти. Набор соответствующих методов режима доступа в этой группе состоит из методов compareAndSet, weakCompareAndSetPlain, weakCompareAndSet, weakCompareAndSetAcquire, weakCompareAndSetRelease, compareAndExchangeAcquire, compareAndExchange, compareAndExchangeRelease, getAndSet, getAndSetAcquire, getAndSetRelease.
  • режимы числового атомарного обновления, например атомарно получающие и устанавливающие значение переменной с помощью сложения с заданными эффектами упорядочения памяти. Набор соответствующих методов режима доступа в этой группе состоит из методов getAndAdd, getAndAddAcquire, getAndAddRelease,
  • режимы побитового атомарного обновления, например атомарно получающие значение переменной и выполняющие над ним побитовое OR с заданными эффектами упорядочения памяти. Набор соответствующих методов режима доступа в этой группе состоит из методов getAndBitwiseOr, getAndBitwiseOrAcquire, getAndBitwiseOrRelease, getAndBitwiseAnd, getAndBitwiseAndAcquire, getAndBitwiseAndRelease, getAndBitwiseXor, getAndBitwiseXorAcquire, getAndBitwiseXorRelease.

Фабричные методы, создающие экземпляры VarHandle или получающие их через lookup, описывают набор поддерживаемых режимов доступа и могут также документировать ограничения, зависящие от типа переменной и от того, доступна ли переменная только для чтения. Если режим доступа не поддерживается, соответствующий метод режима доступа при вызове выбрасывает UnsupportedOperationException. Фабричные методы должны документировать любые дополнительные исключения, не объявленные в сигнатуре, которые могут выбрасываться методами режима доступа. Режим доступа get поддерживается всеми экземплярами VarHandle, и соответствующий метод никогда не выбрасывает UnsupportedOperationException. Если VarHandle ссылается на переменную, доступную только для чтения (например, поле final), то режимы доступа для записи, атомарного обновления, числового атомарного обновления и побитового атомарного обновления не поддерживаются, а соответствующие методы выбрасывают UnsupportedOperationException. Режимы доступа для чтения/записи (если поддерживаются), за исключением get и set, обеспечивают атомарный доступ для ссылочных типов и всех примитивных типов. Если в документации фабричного метода не указано иное, режимы доступа get и set (если поддерживаются) обеспечивают атомарный доступ для ссылочных типов и всех примитивных типов, за исключением long и double на 32-разрядных платформах.

Режимы доступа переопределяют любые эффекты упорядочения памяти, заданные при объявлении переменной. Например, VarHandle, обращающийся к полю с использованием режима доступа get, будет обращаться к полю в соответствии с заданным режимом доступа, даже если поле объявлено как volatile. При смешанном доступе следует проявлять крайнюю осторожность, поскольку модель памяти Java может допускать неожиданные результаты.

Помимо поддержки доступа к переменным в различных режимах доступа, для тонкого управления упорядочением памяти предоставляется набор статических методов, называемых методами барьеров памяти. Спецификация языка Java допускает, что другие потоки могут наблюдать операции так, как если бы они выполнялись в порядке, отличном от очевидного из исходного кода программы, с учётом ограничений, возникающих, например, при использовании блокировок, полей volatile или VarHandle. Статические методы fullFence, acquireFence, releaseFence, loadLoadFence и storeStoreFence также можно использовать для наложения ограничений. Их спецификации, как и спецификации некоторых режимов доступа, сформулированы через отсутствие «переупорядочений» — наблюдаемых эффектов упорядочения, которые в противном случае могли бы возникнуть при отсутствии барьера. В будущих обновлениях спецификации языка Java формулировки спецификаций методов режима доступа и методов барьеров памяти могут стать точнее.

Компиляция вызовов методов режима доступа

Выражение вызова метода Java, указывающее метод режима доступа, может вызывать VarHandle из исходного кода Java. С точки зрения исходного кода эти методы могут принимать любые аргументы, а их полиморфный результат (если он указан) может быть приведён к любому типу возвращаемого значения. Формально это обеспечивается тем, что методы режима доступа принимают аргументы переменной длины Object и имеют тип возвращаемого значения Object (если тип возвращаемого значения полиморфный), однако у них есть дополнительное свойство, называемое полиморфизмом сигнатуры, которое напрямую связывает эту свободу вызова со стеком выполнения JVM.

Как и обычно для виртуальных методов, вызовы методов режима доступа на уровне исходного кода компилируются в инструкцию invokevirtual. Необычно то, что компилятор должен записать фактические типы аргументов и не может выполнять преобразования аргументов при вызове метода. Вместо этого он должен сгенерировать инструкции для помещения аргументов в стек в соответствии с их исходными типами, без преобразований. Сам объект VarHandle помещается в стек перед аргументами. Затем компилятор генерирует инструкцию invokevirtual, вызывающую метод режима доступа с символьным дескриптором типа, описывающим типы аргументов и возвращаемого значения.

Чтобы сформировать полный символьный дескриптор типа, компилятор должен также определить тип возвращаемого значения (если он полиморфный). Он определяется на основе приведения в выражении вызова метода, если оно присутствует, в противном случае — Object, если вызов является выражением, либо void, если вызов является оператором. Приведение может быть к примитивному типу (но не к void).

В частном случае аргумент null без явного приведения получает символьный дескриптор типа java.lang.Void. Неоднозначность с типом Void безвредна, поскольку ссылок типа Void не существует, кроме нулевой ссылки.

Выполнение вызовов методов режима доступа

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

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

По умолчанию вызов метода режима доступа ведёт себя так, как если бы был выполнен вызов MethodHandle.invoke(Object...), где принимающий дескриптор метода принимает экземпляр VarHandle в качестве первого аргумента. В частности, следующее, где {access-mode} соответствует имени метода режима доступа:

VarHandle vh = ..
R r = (R) vh.{access-mode}(p1, p2, ..., pN);
ведёт себя так, как если бы:
VarHandle vh = ..
VarHandle.AccessMode am = VarHandle.AccessMode.valueFromMethodName("{access-mode}");
MethodHandle mh = MethodHandles.varHandleExactInvoker(
                      am,
                      vh.accessModeType(am));

R r = (R) mh.invoke(vh, p1, p2, ..., pN)
(с учётом того, что методы режима доступа не объявляют о выбрасывании Throwable). Это эквивалентно:
MethodHandle mh = MethodHandles.lookup().findVirtual(
                      VarHandle.class,
                      "{access-mode}",
                      MethodType.methodType(R, p1, p2, ..., pN));

R r = (R) mh.invokeExact(vh, p1, p2, ..., pN)
где требуемый тип метода — это символьный дескриптор типа и выполняется вызов MethodHandle.invokeExact(Object...), поскольку перед вызовом целевого метода дескриптор выполняет необходимые приведения ссылок, а также упаковывает, распаковывает или расширяет примитивные значения, как если бы использовался метод asType (см. также MethodHandles.varHandleInvoker(VarHandle.AccessMode, MethodType)). Более кратко, такое поведение эквивалентно:
VarHandle vh = ..
VarHandle.AccessMode am = VarHandle.AccessMode.valueFromMethodName("{access-mode}");
MethodHandle mh = vh.toMethodHandle(am);

R r = (R) mh.invoke(p1, p2, ..., pN)
В данном случае дескриптор метода привязан к экземпляру VarHandle.

Поведение вызова VarHandle можно изменить (см. withInvokeExactBehavior()) так, чтобы вызов метода режима доступа вёл себя так, как если бы был выполнен вызов MethodHandle.invokeExact(Object...), где принимающий дескриптор метода принимает экземпляр VarHandle в качестве первого аргумента. В частности, следующее, где {access-mode} соответствует имени метода режима доступа:

VarHandle vh = ..
R r = (R) vh.{access-mode}(p1, p2, ..., pN);
ведёт себя так, как если бы:
VarHandle vh = ..
VarHandle.AccessMode am = VarHandle.AccessMode.valueFromMethodName("{access-mode}");
MethodHandle mh = MethodHandles.varHandleExactInvoker(
                      am,
                      vh.accessModeType(am));

R r = (R) mh.invokeExact(vh, p1, p2, ..., pN)
(с учётом того, что методы режима доступа не объявляют о выбрасывании Throwable). Более кратко, такое поведение эквивалентно:
VarHandle vh = ..
VarHandle.AccessMode am = VarHandle.AccessMode.valueFromMethodName("{access-mode}");
MethodHandle mh = vh.toMethodHandle(am);

R r = (R) mh.invokeExact(p1, p2, ..., pN)
В данном случае дескриптор метода привязан к экземпляру VarHandle.

Проверка вызовов

В типичных программах сопоставление типов режимов доступа VarHandle обычно завершается успешно. Однако при несовпадении JVM выбросит WrongMethodTypeException.

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

Поскольку типы режимов доступа содержат «живые» объекты Class, при сопоставлении типов методов учитываются как имена типов, так и загрузчики классов. Таким образом, даже если VarHandle VH создан в одном загрузчике классов L1 и используется в другом L2, вызовы методов режима доступа VarHandle остаются типобезопасными, поскольку символьный дескриптор типа вызывающей стороны, разрешённый в L2, сопоставляется с исходным символьным дескриптором типа вызываемого метода, разрешённым в L1. Разрешение в L1 происходит при создании VH и присвоении ему типов режимов доступа, а разрешение в L2 происходит при связывании инструкции invokevirtual.

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

В отличие от Core Reflection API, где доступ проверяется при каждом вызове рефлексивного метода, проверка доступа VarHandle выполняется при создании VarHandle. Поэтому VarHandle для непубличных переменных или переменных в непубличных классах, как правило, следует хранить в секрете. Не следует передавать их недоверенному коду, если только их использование этим кодом не является безвредным.

Создание VarHandle

Код Java может создать VarHandle, напрямую обращающийся к любому полю, доступному этому коду. Это выполняется с помощью рефлексивного API на основе возможностей, называемого MethodHandles.Lookup. Например, VarHandle для нестатического поля можно получить с помощью Lookup.findVarHandle. Существует также метод преобразования объектов Core Reflection API — Lookup.unreflectVarHandle.

Доступ к защищённым членам-полям ограничен получателями, принадлежащими только обращающемуся классу или одному из его подклассов; при этом сам обращающийся класс должен быть подклассом (или находиться в том же пакете), что и класс, в котором определён защищённый член. Если VarHandle ссылается на защищённое нестатическое поле класса-объявителя, находящегося вне текущего пакета, аргумент-получатель будет сужен до типа обращающегося класса.

Взаимодействие VarHandle с Core Reflection API

С помощью фабричных методов API Lookup любое поле, представленное объектом Core Reflection API, можно преобразовать в поведенчески эквивалентный VarHandle. Например, рефлексивное представление Field можно преобразовать в VarHandle с помощью Lookup.unreflectVarHandle. Полученные VarHandle обычно обеспечивают более прямой и эффективный доступ к базовым полям.

В частном случае, когда Core Reflection API используется для просмотра методов с полиморфной сигнатурой режима доступа в этом классе, они выглядят как обычные неполиморфные методы. Их рефлексивное представление, получаемое с помощью Class.getDeclaredMethod, не зависит от их особого статуса в этом API. Например, Method.getModifiers сообщит в точности те биты модификаторов, которые требуются для любого метода с аналогичным объявлением, включая в данном случае биты native и varargs.

Как и любой рефлексивный метод, эти методы (в рефлексивном представлении) можно вызывать напрямую через java.lang.reflect.Method.invoke, через JNI или косвенно с помощью Lookup.unreflect. Однако такие рефлексивные вызовы не приводят к вызову методов режима доступа. Такой вызов, если ему передать обязательный аргумент (единственный, типа Object[]), проигнорирует аргумент и выбросит UnsupportedOperationException.

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

Чтобы получить метод-вызыватель для определённого типа режима доступа, используйте MethodHandles.varHandleExactInvoker(VarHandle.AccessMode, MethodType) или MethodHandles.varHandleInvoker(VarHandle.AccessMode, MethodType). API Lookup.findVirtual также может вернуть дескриптор метода для вызова метода режима доступа с любым заданным типом режима доступа; по поведению он эквивалентен MethodHandles.varHandleInvoker(VarHandle.AccessMode, MethodType).

Взаимодействие VarHandle с обобщениями Java

VarHandle можно получить для переменной, например поля, объявленного с использованием обобщённых типов Java. Как и в Core Reflection API, тип переменной VarHandle будет построен на основе стирания типа исходного уровня. При вызове метода режима доступа VarHandle типы аргументов или тип приведения возвращаемого значения могут быть обобщёнными типами или экземплярами типов. В этом случае компилятор заменит эти типы их стёртыми формами при формировании символьного дескриптора типа для инструкции invokevirtual.
Начиная с версии:
9
См. также:
  • MethodHandle
  • MethodHandles
  • MethodType

Краткое описание вложенных классов

Модификатор и тип Класс Описание
static enum  VarHandle.AccessMode
Набор режимов доступа, определяющих способ доступа к переменной, на которую ссылается VarHandle.
static final class  VarHandle.VarHandleDesc
Номинальный дескриптор для константы VarHandle.

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

Модификатор и тип Метод Описание
final MethodType accessModeType(VarHandle.AccessMode accessMode)
Возвращает тип режима доступа для данного VarHandle и указанного режима доступа.
static void acquireFence()
Гарантирует, что загрузки, выполненные до барьера, не будут переупорядочены относительно загрузок и сохранений после барьера.
final Object compareAndExchange(Object... args)
Атомарно устанавливает значение переменной в newValue с семантикой памяти метода setVolatile(Object...), если текущее значение переменной, называемое значением-свидетелем, == expectedValue, полученное с семантикой памяти метода getVolatile(Object...).
final Object compareAndExchangeAcquire(Object... args)
Атомарно устанавливает значение переменной в newValue с семантикой памяти метода set(Object...), если текущее значение переменной, называемое значением-свидетелем, == expectedValue, полученное с семантикой памяти метода getAcquire(Object...).
final Object compareAndExchangeRelease(Object... args)
Атомарно устанавливает значение переменной в newValue с семантикой памяти метода setRelease(Object...), если текущее значение переменной, называемое значением-свидетелем, == expectedValue, полученное с семантикой памяти метода get(Object...).
final boolean compareAndSet(Object... args)
Атомарно устанавливает значение переменной в newValue с семантикой памяти метода setVolatile(Object...), если текущее значение переменной, называемое значением-свидетелем, == expectedValue, полученное с семантикой памяти метода getVolatile(Object...).
List<Class<?>> coordinateTypes()
Возвращает типы координат для данного VarHandle.
Optional<VarHandle.VarHandleDesc> describeConstable()
Возвращает номинальный дескриптор данного экземпляра, если его можно создать, или пустой Optional, если создать его невозможно.
static void fullFence()
Гарантирует, что загрузки и сохранения, выполненные до барьера, не будут переупорядочены относительно загрузок и сохранений после барьера.
final Object get(Object... args)
Возвращает значение переменной с семантикой памяти, соответствующей чтению так, как если бы переменная была объявлена не-volatile.
final Object getAcquire(Object... args)
Возвращает значение переменной и гарантирует, что последующие загрузки и сохранения не будут переупорядочены перед этим обращением.
final Object getAndAdd(Object... args)
Атомарно прибавляет value к текущему значению переменной с семантикой памяти метода setVolatile(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода getVolatile(Object...).
final Object getAndAddAcquire(Object... args)
Атомарно прибавляет value к текущему значению переменной с семантикой памяти метода set(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода getAcquire(Object...).
final Object getAndAddRelease(Object... args)
Атомарно прибавляет value к текущему значению переменной с семантикой памяти метода setRelease(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода get(Object...).
final Object getAndBitwiseAnd(Object... args)
Атомарно устанавливает значение переменной в результат побитового И между текущим значением переменной и mask с семантикой памяти метода setVolatile(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода getVolatile(Object...).
final Object getAndBitwiseAndAcquire(Object... args)
Атомарно устанавливает значение переменной в результат побитового И между текущим значением переменной и mask с семантикой памяти метода set(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода getAcquire(Object...).
final Object getAndBitwiseAndRelease(Object... args)
Атомарно устанавливает значение переменной в результат побитового И между текущим значением переменной и mask с семантикой памяти метода setRelease(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода get(Object...).
final Object getAndBitwiseOr(Object... args)
Атомарно устанавливает значение переменной в результат побитового ИЛИ между текущим значением переменной и mask с семантикой памяти метода setVolatile(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода getVolatile(Object...).
final Object getAndBitwiseOrAcquire(Object... args)
Атомарно устанавливает значение переменной в результат побитового ИЛИ между текущим значением переменной и mask с семантикой памяти метода set(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода getAcquire(Object...).
final Object getAndBitwiseOrRelease(Object... args)
Атомарно устанавливает значение переменной в результат побитового ИЛИ между текущим значением переменной и mask с семантикой памяти метода setRelease(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода get(Object...).
final Object getAndBitwiseXor(Object... args)
Атомарно устанавливает значение переменной в результат побитового исключающего ИЛИ между текущим значением переменной и mask с семантикой памяти метода setVolatile(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода getVolatile(Object...).
final Object getAndBitwiseXorAcquire(Object... args)
Атомарно устанавливает значение переменной в результат побитового исключающего ИЛИ между текущим значением переменной и mask с семантикой памяти метода set(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода getAcquire(Object...).
final Object getAndBitwiseXorRelease(Object... args)
Атомарно устанавливает значение переменной в результат побитового исключающего ИЛИ между текущим значением переменной и mask с семантикой памяти метода setRelease(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода get(Object...).
final Object getAndSet(Object... args)
Атомарно устанавливает значение переменной в newValue с семантикой памяти метода setVolatile(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода getVolatile(Object...).
final Object getAndSetAcquire(Object... args)
Атомарно устанавливает значение переменной в newValue с семантикой памяти метода set(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода getAcquire(Object...).
final Object getAndSetRelease(Object... args)
Атомарно устанавливает значение переменной в newValue с семантикой памяти метода setRelease(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода get(Object...).
final Object getOpaque(Object... args)
Возвращает значение переменной в порядке выполнения программы, но без гарантий эффектов упорядочения памяти относительно других потоков.
final Object getVolatile(Object... args)
Возвращает значение переменной с семантикой памяти, соответствующей чтению так, как если бы переменная была объявлена volatile.
boolean hasInvokeExactBehavior()
Возвращает true, если для данного VarHandle используется точное поведение вызова.
boolean isAccessModeSupported(VarHandle.AccessMode accessMode)
Возвращает true, если указанный режим доступа поддерживается, и false в противном случае.
static void loadLoadFence()
Гарантирует, что загрузки, выполненные до барьера, не будут переупорядочены относительно загрузок после барьера.
static void releaseFence()
Гарантирует, что загрузки и сохранения, выполненные до барьера, не будут переупорядочены относительно сохранений после барьера.
final void set(Object... args)
Устанавливает значение переменной в newValue с семантикой памяти, соответствующей записи так, как если бы переменная была объявлена не-volatile и не-final.
final void setOpaque(Object... args)
Устанавливает значение переменной в newValue в порядке выполнения программы, но без гарантий эффектов упорядочения памяти относительно других потоков.
final void setRelease(Object... args)
Устанавливает значение переменной в newValue и гарантирует, что предшествующие загрузки и сохранения не будут переупорядочены после этого обращения.
final void setVolatile(Object... args)
Устанавливает значение переменной в newValue с семантикой памяти, соответствующей записи так, как если бы переменная была объявлена volatile.
static void storeStoreFence()
Гарантирует, что сохранения, выполненные до барьера, не будут переупорядочены относительно сохранений после барьера.
MethodHandle toMethodHandle(VarHandle.AccessMode accessMode)
Получает дескриптор метода, связанный с данным VarHandle и указанным режимом доступа.
final String toString()
Возвращает краткое текстовое описание данного VarHandle, включая тип описываемой переменной и описание её координат.
Class<?> varType()
Возвращает тип переменных, на которые ссылается данный VarHandle.
final boolean weakCompareAndSet(Object... args)
Возможно, атомарно устанавливает значение переменной в newValue с семантикой памяти метода setVolatile(Object...), если текущее значение переменной, называемое значением-свидетелем, == expectedValue, полученное с семантикой памяти метода getVolatile(Object...).
final boolean weakCompareAndSetAcquire(Object... args)
Возможно, атомарно устанавливает значение переменной в newValue с семантикой метода set(Object...), если текущее значение переменной, называемое значением-свидетелем, == expectedValue, полученное с семантикой памяти метода getAcquire(Object...).
final boolean weakCompareAndSetPlain(Object... args)
Возможно, атомарно устанавливает значение переменной в newValue с семантикой метода set(Object...), если текущее значение переменной, называемое значением-свидетелем, == expectedValue, полученное с семантикой памяти метода get(Object...).
final boolean weakCompareAndSetRelease(Object... args)
Возможно, атомарно устанавливает значение переменной в newValue с семантикой метода setRelease(Object...), если текущее значение переменной, называемое значением-свидетелем, == expectedValue, полученное с семантикой памяти метода get(Object...).
abstract VarHandle withInvokeBehavior()
Возвращает VarHandle, обеспечивающий доступ к той же переменной или тем же переменным, что и данный VarHandle, но с поведением вызова методов режимов доступа, настроенным на поведение вызова.
abstract VarHandle withInvokeExactBehavior()
Возвращает VarHandle, обеспечивающий доступ к той же переменной или тем же переменным, что и данный VarHandle, но с поведением вызова методов режимов доступа, настроенным на точное поведение вызова.

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

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

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

hasInvokeExactBehavior

public boolean hasInvokeExactBehavior()
Возвращает true, если этот VarHandle имеет поведение invoke-exact.
Возвращает:
true, если этот VarHandle имеет поведение invoke-exact.
Начиная с:
16
См. также:
  • withInvokeExactBehavior()
  • withInvokeBehavior()

get

public final Object get(Object... args)
Возвращает значение переменной с семантикой памяти, соответствующей чтению так, как если бы переменная была объявлена не-volatile. Обычно это называется обычным доступом для чтения.

Сигнатура метода имеет вид (CT1 ct1, ..., CTn ctn)T.

Символьный дескриптор типа в месте вызова get должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.GET) для этого VarHandle.

Этот режим доступа поддерживается всеми экземплярами VarHandle и никогда не вызывает UnsupportedOperationException.

Параметры:
args — список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn), статически представленный с помощью varargs.
Возвращает:
результат с полиморфной сигнатурой, представляющий собой значение переменной, статически представленный с помощью Object.
Вызывает исключения:
WrongMethodTypeException — если тип режима доступа не соответствует символьному дескриптору типа вызывающего кода.
ClassCastException — если тип режима доступа соответствует символьному дескриптору типа вызывающего кода, но приведение ссылки завершается неудачей.

set

public final void set(Object... args)
Устанавливает значение переменной в newValue с семантикой памяти, соответствующей установке значения так, как если бы переменная была объявлена не-volatile и не-final. Обычно это называется обычным доступом для записи.

Сигнатура метода имеет вид (CT1 ct1, ..., CTn ctn, T newValue)void

Символьный дескриптор типа в месте вызова set должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.SET) для этого VarHandle.

Параметры:
args — список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T newValue), статически представленный с помощью varargs.
Вызывает исключения:
UnsupportedOperationException — если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException — если тип режима доступа не соответствует символьному дескриптору типа вызывающего кода.
ClassCastException — если тип режима доступа соответствует символьному дескриптору типа вызывающего кода, но приведение ссылки завершается неудачей.

getVolatile

public final Object getVolatile(Object... args)
Возвращает значение переменной с семантикой памяти, соответствующей чтению так, как если бы переменная была объявлена volatile.

Сигнатура метода имеет вид (CT1 ct1, ..., CTn ctn)T.

Символьный дескриптор типа в месте вызова getVolatile должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.GET_VOLATILE) для этого VarHandle.

Параметры:
args — список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn), статически представленный с помощью varargs.
Возвращает:
результат с полиморфной сигнатурой, представляющий собой значение переменной, статически представленный с помощью Object.
Вызывает исключения:
UnsupportedOperationException — если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException — если тип режима доступа не соответствует символьному дескриптору типа вызывающего кода.
ClassCastException — если тип режима доступа соответствует символьному дескриптору типа вызывающего кода, но приведение ссылки завершается неудачей.

setVolatile

public final void setVolatile(Object... args)
Устанавливает значение переменной в newValue с семантикой памяти, соответствующей установке значения так, как если бы переменная была объявлена volatile.

Сигнатура метода имеет вид (CT1 ct1, ..., CTn ctn, T newValue)void.

Символьный дескриптор типа в месте вызова setVolatile должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.SET_VOLATILE) для этого VarHandle.

Примечание к API:
Несмотря на множество семантических различий с C и C++, этот метод имеет эффекты упорядочивания памяти, совместимые с memory_order_seq_cst.
Параметры:
args — список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T newValue), статически представленный с помощью varargs.
Вызывает исключения:
UnsupportedOperationException — если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException — если тип режима доступа не соответствует символьному дескриптору типа вызывающего кода.
ClassCastException — если тип режима доступа соответствует символьному дескриптору типа вызывающего кода, но приведение ссылки завершается неудачей.

getOpaque

public final Object getOpaque(Object... args)
Возвращает значение переменной, обращаясь к ней в порядке выполнения программы, но без гарантий относительно эффектов упорядочивания памяти по отношению к другим потокам.

Сигнатура метода имеет вид (CT1 ct1, ..., CTn ctn)T.

Символьный дескриптор типа в месте вызова getOpaque должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.GET_OPAQUE) для этого VarHandle.

Параметры:
args — список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn), статически представленный с помощью varargs.
Возвращает:
результат с полиморфной сигнатурой, представляющий собой значение переменной, статически представленный с помощью Object.
Вызывает исключения:
UnsupportedOperationException — если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException — если тип режима доступа не соответствует символьному дескриптору типа вызывающего кода.
ClassCastException — если тип режима доступа соответствует символьному дескриптору типа вызывающего кода, но приведение ссылки завершается неудачей.

setOpaque

public final void setOpaque(Object... args)
Устанавливает значение переменной в newValue в порядке выполнения программы, но без гарантий относительно эффектов упорядочивания памяти по отношению к другим потокам.

Сигнатура метода имеет вид (CT1 ct1, ..., CTn ctn, T newValue)void.

Символьный дескриптор типа в месте вызова setOpaque должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.SET_OPAQUE) для этого VarHandle.

Параметры:
args — список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T newValue), статически представленный с помощью varargs.
Вызывает исключения:
UnsupportedOperationException — если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException — если тип режима доступа не соответствует символьному дескриптору типа вызывающего кода.
ClassCastException — если тип режима доступа соответствует символьному дескриптору типа вызывающего кода, но приведение ссылки завершается неудачей.

getAcquire

public final Object getAcquire(Object... args)
Возвращает значение переменной и гарантирует, что последующие операции загрузки и сохранения не будут перемещены перед этим обращением.

Сигнатура метода имеет вид (CT1 ct1, ..., CTn ctn)T.

Символьный дескриптор типа в месте вызова getAcquire должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.GET_ACQUIRE) для этого VarHandle.

Примечание к API:
Несмотря на множество семантических различий с C и C++, этот метод имеет эффекты упорядочивания памяти, совместимые с упорядочиванием memory_order_acquire.
Параметры:
args — список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn), статически представленный с помощью varargs.
Возвращает:
результат с полиморфной сигнатурой, представляющий собой значение переменной, статически представленный с помощью Object.
Вызывает исключения:
UnsupportedOperationException — если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException — если тип режима доступа не соответствует символьному дескриптору типа вызывающего кода.
ClassCastException — если тип режима доступа соответствует символьному дескриптору типа вызывающего кода, но приведение ссылки завершается неудачей.

setRelease

public final void setRelease(Object... args)
Устанавливает значение переменной в newValue и гарантирует, что предшествующие операции загрузки и сохранения не будут перемещены после этого обращения.

Сигнатура метода имеет вид (CT1 ct1, ..., CTn ctn, T newValue)void.

Символьный дескриптор типа в месте вызова setRelease должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.SET_RELEASE) для этого VarHandle.

Примечание к API:
Несмотря на множество семантических различий с C и C++, этот метод имеет эффекты упорядочивания памяти, совместимые с упорядочиванием memory_order_release.
Параметры:
args — список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T newValue), статически представленный с помощью varargs.
Вызывает исключения:
UnsupportedOperationException — если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException — если тип режима доступа не соответствует символьному дескриптору типа вызывающего кода.
ClassCastException — если тип режима доступа соответствует символьному дескриптору типа вызывающего кода, но приведение ссылки завершается неудачей.

compareAndSet

public final boolean compareAndSet(Object... args)
Атомарно устанавливает значение переменной в newValue с семантикой памяти метода setVolatile(Object...), если текущее значение переменной, называемое свидетельствующим значением, == expectedValue, полученное с семантикой памяти метода getVolatile(Object...).

Сигнатура метода имеет вид (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)boolean.

Символьный дескриптор типа в месте вызова compareAndSet должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.COMPARE_AND_SET) для этого VarHandle.

Параметры:
args — список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue), статически представленный с помощью varargs.
Возвращает:
true в случае успеха; в противном случае false, если свидетельствующее значение не совпало с expectedValue.
Вызывает исключения:
UnsupportedOperationException — если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException — если тип режима доступа не соответствует символьному дескриптору типа вызывающего кода.
ClassCastException — если тип режима доступа соответствует символьному дескриптору типа вызывающего кода, но приведение ссылки завершается неудачей.
См. также:
  • setVolatile(Object...)
  • getVolatile(Object...)

compareAndExchange

public final Object compareAndExchange(Object... args)
Атомарно устанавливает значение переменной в newValue с семантикой памяти метода setVolatile(Object...), если текущее значение переменной, называемое свидетельствующим значением, == expectedValue, полученное с семантикой памяти метода getVolatile(Object...).

Сигнатура метода имеет вид (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)T.

Символьный дескриптор типа в месте вызова compareAndExchange должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.COMPARE_AND_EXCHANGE) для этого VarHandle.

Параметры:
args — список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue), статически представленный с помощью varargs.
Возвращает:
результат с полиморфной сигнатурой, представляющий собой свидетельствующее значение, которое в случае успеха будет совпадать с expectedValue, статически представленный с помощью Object.
Вызывает исключения:
UnsupportedOperationException — если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException — если тип режима доступа несовместим с символьным дескриптором типа вызывающего кода.
ClassCastException — если тип режима доступа совместим с символьным дескриптором типа вызывающего кода, но приведение ссылки завершается неудачей.
См. также:
  • setVolatile(Object...)
  • getVolatile(Object...)

compareAndExchangeAcquire

public final Object compareAndExchangeAcquire(Object... args)
Атомарно устанавливает значение переменной в newValue с семантикой памяти метода set(Object...), если текущее значение переменной, называемое свидетельствующим значением, == expectedValue, полученное с семантикой памяти метода getAcquire(Object...).

Сигнатура метода имеет вид (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)T.

Символьный дескриптор типа в месте вызова compareAndExchangeAcquire должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE) для этого VarHandle.

Параметры:
args — список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue), статически представленный с помощью varargs.
Возвращает:
результат с полиморфной сигнатурой, представляющий собой свидетельствующее значение, которое в случае успеха будет совпадать с expectedValue, статически представленный с помощью Object.
Вызывает исключения:
UnsupportedOperationException — если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException — если тип режима доступа не соответствует символьному дескриптору типа вызывающего кода.
ClassCastException — если тип режима доступа соответствует символьному дескриптору типа вызывающего кода, но приведение ссылки завершается неудачей.
См. также:
  • set(Object...)
  • getAcquire(Object...)

compareAndExchangeRelease

public final Object compareAndExchangeRelease(Object... args)
Атомарно устанавливает значение переменной в newValue с семантикой памяти метода setRelease(Object...), если текущее значение переменной, называемое свидетельствующим значением, == expectedValue, полученное с семантикой памяти метода get(Object...).

Сигнатура метода имеет вид (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)T.

Символьный дескриптор типа в месте вызова compareAndExchangeRelease должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE) для этого VarHandle.

Параметры:
args — список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue), статически представленный с помощью varargs.
Возвращает:
результат с полиморфной сигнатурой, представляющий собой свидетельствующее значение, которое в случае успеха будет совпадать с expectedValue, статически представленный с помощью Object.
Вызывает исключения:
UnsupportedOperationException — если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException — если тип режима доступа не соответствует символьному дескриптору типа вызывающего кода.
ClassCastException — если тип режима доступа соответствует символьному дескриптору типа вызывающего кода, но приведение ссылки завершается неудачей.
См. также:
  • setRelease(Object...)
  • get(Object...)

weakCompareAndSetPlain

public final boolean weakCompareAndSetPlain(Object... args)
Возможно, атомарно устанавливает значение переменной в newValue с семантикой метода set(Object...), если текущее значение переменной, называемое свидетельствующим значением, == expectedValue, полученное с семантикой памяти метода get(Object...).

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

Сигнатура метода имеет вид (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)boolean.

Символьный дескриптор типа в месте вызова weakCompareAndSetPlain должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_PLAIN) для этого VarHandle.

Параметры:
args — список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue), статически представленный с помощью varargs.
Возвращает:
true в случае успеха; в противном случае false, если свидетельствующее значение не совпало с expectedValue или если операция завершилась ложным сбоем.
Вызывает исключения:
UnsupportedOperationException — если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException — если тип режима доступа не соответствует символьному дескриптору типа вызывающего кода.
ClassCastException — если тип режима доступа соответствует символьному дескриптору типа вызывающего кода, но приведение ссылки завершается неудачей.
См. также:
  • set(Object...)
  • get(Object...)

weakCompareAndSet

public final boolean weakCompareAndSet(Object... args)
Возможно, атомарно устанавливает значение переменной в newValue с семантикой памяти метода setVolatile(Object...), если текущее значение переменной, называемое свидетельствующим значением, == expectedValue, полученное с семантикой памяти метода getVolatile(Object...).

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

Сигнатура метода имеет вид (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)boolean.

Символьный дескриптор типа в месте вызова weakCompareAndSet должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.WEAK_COMPARE_AND_SET) для этого VarHandle.

Параметры:
args — список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue), статически представленный с помощью varargs.
Возвращает:
true в случае успеха; в противном случае false, если свидетельствующее значение не совпало с expectedValue или если операция завершилась ложным сбоем.
Вызывает исключения:
UnsupportedOperationException — если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException — если тип режима доступа не соответствует символьному дескриптору типа вызывающего кода.
ClassCastException — если тип режима доступа соответствует символьному дескриптору типа вызывающего кода, но приведение ссылки завершается неудачей.
См. также:
  • setVolatile(Object...)
  • getVolatile(Object...)

weakCompareAndSetAcquire

public final boolean weakCompareAndSetAcquire(Object... args)
Возможно, атомарно устанавливает значение переменной в newValue с семантикой метода set(Object...), если текущее значение переменной, называемое свидетельствующим значением, == expectedValue, полученное с семантикой памяти метода getAcquire(Object...).

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

Сигнатура метода имеет вид (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)boolean.

Символьный дескриптор типа в месте вызова weakCompareAndSetAcquire должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE) для этого VarHandle.

Параметры:
args — список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue), статически представленный с помощью varargs.
Возвращает:
true в случае успеха; в противном случае false, если свидетельствующее значение не совпало с expectedValue или если операция завершилась ложным сбоем.
Вызывает исключения:
UnsupportedOperationException — если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException — если тип режима доступа не соответствует символьному дескриптору типа вызывающего кода.
ClassCastException — если тип режима доступа соответствует символьному дескриптору типа вызывающего кода, но приведение ссылки завершается неудачей.
См. также:
  • set(Object...)
  • getAcquire(Object...)

weakCompareAndSetRelease

public final boolean weakCompareAndSetRelease(Object... args)
Возможно, атомарно устанавливает значение переменной в newValue с семантикой метода setRelease(Object...), если текущее значение переменной, называемое свидетельствующим значением, == expectedValue, полученное с семантикой памяти метода get(Object...).

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

Сигнатура метода имеет вид (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)boolean.

Символьный дескриптор типа в месте вызова weakCompareAndSetRelease должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE) для этого VarHandle.

Параметры:
args — список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue), статически представленный с помощью varargs.
Возвращает:
true в случае успеха; в противном случае false, если свидетельствующее значение не совпало с expectedValue или если операция завершилась ложным сбоем.
Вызывает исключения:
UnsupportedOperationException — если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException — если тип режима доступа не соответствует символьному дескриптору типа вызывающего кода.
ClassCastException — если тип режима доступа соответствует символьному дескриптору типа вызывающего кода, но приведение ссылки завершается неудачей.
См. также:
  • setRelease(Object...)
  • get(Object...)

getAndSet

public final Object getAndSet(Object... args)
Атомарно устанавливает значение переменной в newValue с семантикой памяти метода setVolatile(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода getVolatile(Object...).

Сигнатура метода имеет вид (CT1 ct1, ..., CTn ctn, T newValue)T.

Символьный дескриптор типа в месте вызова getAndSet должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.GET_AND_SET) для этого VarHandle.

Параметры:
args — список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T newValue), статически представленный с помощью varargs.
Возвращает:
результат с полиморфной сигнатурой, представляющий собой предыдущее значение переменной, статически представленный с помощью Object.
Вызывает исключения:
UnsupportedOperationException — если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException — если тип режима доступа не соответствует символьному дескриптору типа вызывающего кода.
ClassCastException — если тип режима доступа соответствует символьному дескриптору типа вызывающего кода, но приведение ссылки завершается неудачей.
См. также:
  • setVolatile(Object...)
  • getVolatile(Object...)

getAndSetAcquire

public final Object getAndSetAcquire(Object... args)
Атомарно устанавливает значение переменной в newValue с семантикой памяти метода set(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода getAcquire(Object...).

Сигнатура метода имеет вид (CT1 ct1, ..., CTn ctn, T newValue)T.

Символьный дескриптор типа в месте вызова getAndSetAcquire должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.GET_AND_SET_ACQUIRE) для этого VarHandle.

Параметры:
args — список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T newValue), статически представленный с помощью varargs.
Возвращает:
результат с полиморфной сигнатурой, представляющий собой предыдущее значение переменной, статически представленный с помощью Object.
Вызывает исключения:
UnsupportedOperationException — если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException — если тип режима доступа не соответствует символьному дескриптору типа вызывающего кода.
ClassCastException — если тип режима доступа соответствует символьному дескриптору типа вызывающего кода, но приведение ссылки завершается неудачей.
См. также:
  • setVolatile(Object...)
  • getVolatile(Object...)

getAndSetRelease

public final Object getAndSetRelease(Object... args)
Атомарно устанавливает значение переменной в newValue с семантикой памяти метода setRelease(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода get(Object...).

Сигнатура метода имеет вид (CT1 ct1, ..., CTn ctn, T newValue)T.

Символьный дескриптор типа в месте вызова getAndSetRelease должен совпадать с типом режима доступа, который возвращает вызов accessModeType(VarHandle.AccessMode.GET_AND_SET_RELEASE) для этого VarHandle.

Параметры:
args — список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T newValue), статически представленный с помощью varargs.
Возвращает:
результат с полиморфной сигнатурой — предыдущее значение переменной, статически представленное с помощью Object.
Выбрасывает:
UnsupportedOperationException — если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException — если тип режима доступа не совпадает с символьным дескриптором типа вызывающего кода.
ClassCastException — если тип режима доступа совпадает с символьным дескриптором типа вызывающего кода, но приведение ссылки завершается ошибкой.
См. также:
  • setVolatile(Object...)
  • getVolatile(Object...)

getAndAdd

public final Object getAndAdd(Object... args)
Атомарно прибавляет value к текущему значению переменной с семантикой памяти метода setVolatile(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода getVolatile(Object...).

Сигнатура метода имеет вид (CT1 ct1, ..., CTn ctn, T value)T.

Символьный дескриптор типа в месте вызова getAndAdd должен совпадать с типом режима доступа, который возвращает вызов accessModeType(VarHandle.AccessMode.GET_AND_ADD) для этого VarHandle.

Параметры:
args — список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T value), статически представленный с помощью varargs.
Возвращает:
результат с полиморфной сигнатурой — предыдущее значение переменной, статически представленное с помощью Object.
Выбрасывает:
UnsupportedOperationException — если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException — если тип режима доступа не совпадает с символьным дескриптором типа вызывающего кода.
ClassCastException — если тип режима доступа совпадает с символьным дескриптором типа вызывающего кода, но приведение ссылки завершается ошибкой.
См. также:
  • setVolatile(Object...)
  • getVolatile(Object...)

getAndAddAcquire

public final Object getAndAddAcquire(Object... args)
Атомарно прибавляет value к текущему значению переменной с семантикой памяти метода set(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода getAcquire(Object...).

Сигнатура метода имеет вид (CT1 ct1, ..., CTn ctn, T value)T.

Символьный дескриптор типа в месте вызова getAndAddAcquire должен совпадать с типом режима доступа, который возвращает вызов accessModeType(VarHandle.AccessMode.GET_AND_ADD_ACQUIRE) для этого VarHandle.

Параметры:
args — список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T value), статически представленный с помощью varargs.
Возвращает:
результат с полиморфной сигнатурой — предыдущее значение переменной, статически представленное с помощью Object.
Выбрасывает:
UnsupportedOperationException — если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException — если тип режима доступа не совпадает с символьным дескриптором типа вызывающего кода.
ClassCastException — если тип режима доступа совпадает с символьным дескриптором типа вызывающего кода, но приведение ссылки завершается ошибкой.
См. также:
  • setVolatile(Object...)
  • getVolatile(Object...)

getAndAddRelease

public final Object getAndAddRelease(Object... args)
Атомарно прибавляет value к текущему значению переменной с семантикой памяти метода setRelease(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода get(Object...).

Сигнатура метода имеет вид (CT1 ct1, ..., CTn ctn, T value)T.

Символьный дескриптор типа в месте вызова getAndAddRelease должен совпадать с типом режима доступа, который возвращает вызов accessModeType(VarHandle.AccessMode.GET_AND_ADD_RELEASE) для этого VarHandle.

Параметры:
args — список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T value), статически представленный с помощью varargs.
Возвращает:
результат с полиморфной сигнатурой — предыдущее значение переменной, статически представленное с помощью Object.
Выбрасывает:
UnsupportedOperationException — если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException — если тип режима доступа не совпадает с символьным дескриптором типа вызывающего кода.
ClassCastException — если тип режима доступа совпадает с символьным дескриптором типа вызывающего кода, но приведение ссылки завершается ошибкой.
См. также:
  • setVolatile(Object...)
  • getVolatile(Object...)

getAndBitwiseOr

public final Object getAndBitwiseOr(Object... args)
Атомарно устанавливает значение переменной в результат побитового OR текущего значения переменной и mask с семантикой памяти метода setVolatile(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода getVolatile(Object...).

Если тип переменной — нецелочисленный тип boolean, вместо побитового OR выполняется логический OR.

Сигнатура метода имеет вид (CT1 ct1, ..., CTn ctn, T mask)T.

Символьный дескриптор типа в месте вызова getAndBitwiseOr должен совпадать с типом режима доступа, который возвращает вызов accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_OR) для этого VarHandle.

Параметры:
args — список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T mask), статически представленный с помощью varargs.
Возвращает:
результат с полиморфной сигнатурой — предыдущее значение переменной, статически представленное с помощью Object.
Выбрасывает:
UnsupportedOperationException — если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException — если тип режима доступа не совпадает с символьным дескриптором типа вызывающего кода.
ClassCastException — если тип режима доступа совпадает с символьным дескриптором типа вызывающего кода, но приведение ссылки завершается ошибкой.
См. также:
  • setVolatile(Object...)
  • getVolatile(Object...)

getAndBitwiseOrAcquire

public final Object getAndBitwiseOrAcquire(Object... args)
Атомарно устанавливает значение переменной в результат побитового OR текущего значения переменной и mask с семантикой памяти метода set(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода getAcquire(Object...).

Если тип переменной — нецелочисленный тип boolean, вместо побитового OR выполняется логический OR.

Сигнатура метода имеет вид (CT1 ct1, ..., CTn ctn, T mask)T.

Символьный дескриптор типа в месте вызова getAndBitwiseOrAcquire должен совпадать с типом режима доступа, который возвращает вызов accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_OR_ACQUIRE) для этого VarHandle.

Параметры:
args — список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T mask), статически представленный с помощью varargs.
Возвращает:
результат с полиморфной сигнатурой — предыдущее значение переменной, статически представленное с помощью Object.
Выбрасывает:
UnsupportedOperationException — если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException — если тип режима доступа не совпадает с символьным дескриптором типа вызывающего кода.
ClassCastException — если тип режима доступа совпадает с символьным дескриптором типа вызывающего кода, но приведение ссылки завершается ошибкой.
См. также:
  • set(Object...)
  • getAcquire(Object...)

getAndBitwiseOrRelease

public final Object getAndBitwiseOrRelease(Object... args)
Атомарно устанавливает значение переменной в результат побитового OR текущего значения переменной и mask с семантикой памяти метода setRelease(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода get(Object...).

Если тип переменной — нецелочисленный тип boolean, вместо побитового OR выполняется логический OR.

Сигнатура метода имеет вид (CT1 ct1, ..., CTn ctn, T mask)T.

Символьный дескриптор типа в месте вызова getAndBitwiseOrRelease должен совпадать с типом режима доступа, который возвращает вызов accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_OR_RELEASE) для этого VarHandle.

Параметры:
args — список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T mask), статически представленный с помощью varargs.
Возвращает:
результат с полиморфной сигнатурой — предыдущее значение переменной, статически представленное с помощью Object.
Выбрасывает:
UnsupportedOperationException — если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException — если тип режима доступа не совпадает с символьным дескриптором типа вызывающего кода.
ClassCastException — если тип режима доступа совпадает с символьным дескриптором типа вызывающего кода, но приведение ссылки завершается ошибкой.
См. также:
  • setRelease(Object...)
  • get(Object...)

getAndBitwiseAnd

public final Object getAndBitwiseAnd(Object... args)
Атомарно устанавливает значение переменной в результат побитового AND текущего значения переменной и mask с семантикой памяти метода setVolatile(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода getVolatile(Object...).

Если тип переменной — нецелочисленный тип boolean, вместо побитового AND выполняется логический AND.

Сигнатура метода имеет вид (CT1 ct1, ..., CTn ctn, T mask)T.

Символьный дескриптор типа в месте вызова getAndBitwiseAnd должен совпадать с типом режима доступа, который возвращает вызов accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_AND) для этого VarHandle.

Параметры:
args — список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T mask), статически представленный с помощью varargs.
Возвращает:
результат с полиморфной сигнатурой — предыдущее значение переменной, статически представленное с помощью Object.
Выбрасывает:
UnsupportedOperationException — если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException — если тип режима доступа не совпадает с символьным дескриптором типа вызывающего кода.
ClassCastException — если тип режима доступа совпадает с символьным дескриптором типа вызывающего кода, но приведение ссылки завершается ошибкой.
См. также:
  • setVolatile(Object...)
  • getVolatile(Object...)

getAndBitwiseAndAcquire

public final Object getAndBitwiseAndAcquire(Object... args)
Атомарно устанавливает значение переменной в результат побитового AND текущего значения переменной и mask с семантикой памяти метода set(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода getAcquire(Object...).

Если тип переменной — нецелочисленный тип boolean, вместо побитового AND выполняется логический AND.

Сигнатура метода имеет вид (CT1 ct1, ..., CTn ctn, T mask)T.

Символьный дескриптор типа в месте вызова getAndBitwiseAndAcquire должен совпадать с типом режима доступа, который возвращает вызов accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_AND_ACQUIRE) для этого VarHandle.

Параметры:
args — список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T mask), статически представленный с помощью varargs.
Возвращает:
результат с полиморфной сигнатурой — предыдущее значение переменной, статически представленное с помощью Object.
Выбрасывает:
UnsupportedOperationException — если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException — если тип режима доступа не совпадает с символьным дескриптором типа вызывающего кода.
ClassCastException — если тип режима доступа совпадает с символьным дескриптором типа вызывающего кода, но приведение ссылки завершается ошибкой.
См. также:
  • set(Object...)
  • getAcquire(Object...)

getAndBitwiseAndRelease

public final Object getAndBitwiseAndRelease(Object... args)
Атомарно устанавливает значение переменной в результат побитового AND текущего значения переменной и mask с семантикой памяти метода setRelease(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода get(Object...).

Если тип переменной — нецелочисленный тип boolean, вместо побитового AND выполняется логический AND.

Сигнатура метода имеет вид (CT1 ct1, ..., CTn ctn, T mask)T.

Символьный дескриптор типа в месте вызова getAndBitwiseAndRelease должен совпадать с типом режима доступа, который возвращает вызов accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_AND_RELEASE) для этого VarHandle.

Параметры:
args — список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T mask), статически представленный с помощью varargs.
Возвращает:
результат с полиморфной сигнатурой — предыдущее значение переменной, статически представленное с помощью Object.
Выбрасывает:
UnsupportedOperationException — если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException — если тип режима доступа не совпадает с символьным дескриптором типа вызывающего кода.
ClassCastException — если тип режима доступа совпадает с символьным дескриптором типа вызывающего кода, но приведение ссылки завершается ошибкой.
См. также:
  • setRelease(Object...)
  • get(Object...)

getAndBitwiseXor

public final Object getAndBitwiseXor(Object... args)
Атомарно устанавливает значение переменной в результат побитового XOR текущего значения переменной и mask с семантикой памяти метода setVolatile(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода getVolatile(Object...).

Если тип переменной — нецелочисленный тип boolean, вместо побитового XOR выполняется логический XOR.

Сигнатура метода имеет вид (CT1 ct1, ..., CTn ctn, T mask)T.

Символьный дескриптор типа в месте вызова getAndBitwiseXor должен совпадать с типом режима доступа, который возвращает вызов accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_XOR) для этого VarHandle.

Параметры:
args — список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T mask), статически представленный с помощью varargs.
Возвращает:
результат с полиморфной сигнатурой — предыдущее значение переменной, статически представленное с помощью Object.
Выбрасывает:
UnsupportedOperationException — если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException — если тип режима доступа не совпадает с символьным дескриптором типа вызывающего кода.
ClassCastException — если тип режима доступа совпадает с символьным дескриптором типа вызывающего кода, но приведение ссылки завершается ошибкой.
См. также:
  • setVolatile(Object...)
  • getVolatile(Object...)

getAndBitwiseXorAcquire

public final Object getAndBitwiseXorAcquire(Object... args)
Атомарно устанавливает значение переменной в результат побитового XOR текущего значения переменной и mask с семантикой памяти метода set(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода getAcquire(Object...).

Если тип переменной — нецелочисленный тип boolean, вместо побитового XOR выполняется логический XOR.

Сигнатура метода имеет вид (CT1 ct1, ..., CTn ctn, T mask)T.

Символьный дескриптор типа в месте вызова getAndBitwiseXorAcquire должен совпадать с типом режима доступа, который возвращает вызов accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_XOR_ACQUIRE) для этого VarHandle.

Параметры:
args — список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T mask), статически представленный с помощью varargs.
Возвращает:
результат с полиморфной сигнатурой — предыдущее значение переменной, статически представленное с помощью Object.
Выбрасывает:
UnsupportedOperationException — если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException — если тип режима доступа не совпадает с символьным дескриптором типа вызывающего кода.
ClassCastException — если тип режима доступа совпадает с символьным дескриптором типа вызывающего кода, но приведение ссылки завершается ошибкой.
См. также:
  • set(Object...)
  • getAcquire(Object...)

getAndBitwiseXorRelease

public final Object getAndBitwiseXorRelease(Object... args)
Атомарно устанавливает значение переменной в результат побитового XOR текущего значения переменной и mask с семантикой памяти метода setRelease(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода get(Object...).

Если тип переменной — нецелочисленный тип boolean, вместо побитового XOR выполняется логический XOR.

Сигнатура метода имеет вид (CT1 ct1, ..., CTn ctn, T mask)T.

Символьный дескриптор типа в месте вызова getAndBitwiseXorRelease должен совпадать с типом режима доступа, который возвращает вызов accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_XOR_RELEASE) для этого VarHandle.

Параметры:
args — список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T mask), статически представленный с помощью varargs.
Возвращает:
результат с полиморфной сигнатурой — предыдущее значение переменной, статически представленное с помощью Object.
Выбрасывает:
UnsupportedOperationException — если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException — если тип режима доступа не совпадает с символьным дескриптором типа вызывающего кода.
ClassCastException — если тип режима доступа совпадает с символьным дескриптором типа вызывающего кода, но приведение ссылки завершается ошибкой.
См. также:
  • setRelease(Object...)
  • get(Object...)

withInvokeExactBehavior

public abstract VarHandle withInvokeExactBehavior()
Возвращает VarHandle с доступом к тем же переменным, что и этот VarHandle, но с поведением вызова методов режима доступа, настроенным на поведение точного вызова.

Если этот VarHandle уже использует поведение точного вызова, возвращается этот же VarHandle.

Гарантируется, что вызов hasInvokeExactBehavior() для возвращённого дескриптора var вернёт true.

Примечание API:
Поведение точного вызова гарантирует, что при вызове метода режима доступа типы и количество аргументов должны соответствовать access mode type, иначе будет выброшено исключение WrongMethodTypeException.
Возвращает:
VarHandle с поведением точного вызова
Начиная с версии:
16
См. также:
  • withInvokeBehavior()
  • hasInvokeExactBehavior()

withInvokeBehavior

public abstract VarHandle withInvokeBehavior()
Возвращает VarHandle с доступом к тем же переменным, что и этот VarHandle, но с поведением вызова методов режима доступа, настроенным на поведение вызова.

Если этот VarHandle уже использует поведение вызова, возвращается этот же VarHandle.

Гарантируется, что вызов hasInvokeExactBehavior() для возвращённого дескриптора var вернёт false.

Возвращает:
VarHandle с поведением вызова
Начиная с версии:
16
См. также:
  • withInvokeExactBehavior()
  • hasInvokeExactBehavior()

toString

public final String toString()
Возвращает краткое текстовое описание этого VarHandle, включая тип описываемой переменной и описание её координат.
Переопределяет:
toString в классе Object
Возвращает:
Краткое текстовое описание этого VarHandle

varType

public Class<?> varType()
Возвращает тип переменных, на которые ссылается этот VarHandle.
Возвращает:
тип переменных, на которые ссылается этот VarHandle

coordinateTypes

public List<Class<?>> coordinateTypes()
Возвращает типы координат этого VarHandle.
Возвращает:
типы координат этого VarHandle. Возвращаемый список нельзя изменить

accessModeType

public final MethodType accessModeType(VarHandle.AccessMode accessMode)
Получает тип режима доступа для этого VarHandle и заданного режима доступа.

Типы параметров типа режима доступа состоят из префикса — типов координат этого VarHandle, за которым следуют дополнительные типы, определяемые методом режима доступа. Тип возвращаемого значения типа режима доступа определяется возвращаемым типом метода режима доступа.

Параметры:
accessMode — режим доступа, соответствующий полиморфному по сигнатуре методу с таким же именем
Возвращает:
тип режима доступа для заданного режима доступа

isAccessModeSupported

public boolean isAccessModeSupported(VarHandle.AccessMode accessMode)
Возвращает true, если заданный режим доступа поддерживается, и false в противном случае.

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

Параметры:
accessMode — режим доступа, соответствующий полиморфному по сигнатуре методу с таким же именем
Возвращает:
true, если заданный режим доступа поддерживается, и false в противном случае.

toMethodHandle

public MethodHandle toMethodHandle(VarHandle.AccessMode accessMode)
Получает дескриптор метода, связанный с этим VarHandle и заданным режимом доступа.
Примечание API:
Этот метод для VarHandle vh и режима доступа {access-mode} возвращает дескриптор метода, эквивалентный дескриптору метода bmh в следующем коде (хотя он может быть более эффективным):
MethodHandle mh = MethodHandles.varHandleExactInvoker(
                      vh.accessModeType(VarHandle.AccessMode.{access-mode}));

MethodHandle bmh = mh.bindTo(vh);
Параметры:
accessMode — режим доступа, соответствующий полиморфному по сигнатуре методу с таким же именем
Возвращает:
дескриптор метода, связанный с этим VarHandle и заданным режимом доступа

describeConstable

public Optional<VarHandle.VarHandleDesc> describeConstable()
Возвращает номинальный дескриптор для этого экземпляра, если его можно создать, или пустой объект Optional, если создать его невозможно.
Определено в:
describeConstable в интерфейсе Constable
Возвращает:
Объект Optional, содержащий полученный номинальный дескриптор, или пустой объект Optional, если создать дескриптор невозможно.
Начиная с версии:
12

fullFence

public static void fullFence()
Гарантирует, что операции чтения и записи до барьера не будут переупорядочены относительно операций чтения и записи после барьера.
Примечание к API:
Если не учитывать многочисленные семантические различия между C и C++, этот метод обеспечивает эффекты упорядочивания памяти, совместимые с atomic_thread_fence(memory_order_seq_cst)

acquireFence

public static void acquireFence()
Гарантирует, что операции чтения до барьера не будут переупорядочены относительно операций чтения и записи после барьера.
Примечание к API:
Если не учитывать многочисленные семантические различия между C и C++, этот метод обеспечивает эффекты упорядочивания памяти, совместимые с atomic_thread_fence(memory_order_acquire)

releaseFence

public static void releaseFence()
Гарантирует, что операции чтения и записи до барьера не будут переупорядочены относительно операций записи после барьера.
Примечание к API:
Если не учитывать многочисленные семантические различия между C и C++, этот метод обеспечивает эффекты упорядочивания памяти, совместимые с atomic_thread_fence(memory_order_release)

loadLoadFence

public static void loadLoadFence()
Гарантирует, что операции чтения до барьера не будут переупорядочены относительно операций чтения после барьера.

storeStoreFence

public static void storeStoreFence()
Гарантирует, что операции записи до барьера не будут переупорядочены относительно операций записи после барьера.

Сообщить об ошибке или предложить улучшение
Дополнительную справочную информацию по API и документацию для разработчиков см. в документации Java SE, содержащей более подробные описания для разработчиков, обзоры концепций, определения терминов, обходные решения и работающие примеры кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или ее аффилированных лиц в США и других странах.
Авторские права © 1993, 2025, Oracle и/или ее аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 1993, 2025, 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/25/docs/api/java.base/java/lang/invoke/VarHandle.html

Spec-Zone.ru

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