Класс VarHandle
- Все реализуемые интерфейсы:
Constable
public abstract sealed class VarHandle extends Object implements Constable
VarHandle неизменяемы и не имеют видимого состояния. Пользователь не может создавать подклассы VarHandle.
VarHandle имеет:
variable typeT — тип каждой переменной, на которую ссылается данный VarHandle; и- список
coordinate typesCT1, 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
С помощью фабричных методов APILookup любое поле, представленное объектом 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
- См. также:
Краткое описание вложенных классов
| Модификатор и тип | Класс | Описание |
|---|---|---|
static enum |
VarHandle.AccessMode |
Набор режимов доступа, определяющих способ доступа к переменной, на которую ссылается VarHandle. |
static final class |
VarHandle.VarHandleDesc |
Номинальный дескриптор для константы VarHandle. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
final MethodType |
accessModeType |
Возвращает тип режима доступа для данного VarHandle и указанного режима доступа. |
static void |
acquireFence() |
Гарантирует, что загрузки, выполненные до барьера, не будут переупорядочены относительно загрузок и сохранений после барьера. |
final Object |
compareAndExchange |
Атомарно устанавливает значение переменной в newValue с семантикой памяти метода setVolatile(Object...), если текущее значение переменной, называемое значением-свидетелем, == expectedValue, полученное с семантикой памяти метода getVolatile(Object...). |
final Object |
compareAndExchangeAcquire |
Атомарно устанавливает значение переменной в newValue с семантикой памяти метода set(Object...), если текущее значение переменной, называемое значением-свидетелем, == expectedValue, полученное с семантикой памяти метода getAcquire(Object...). |
final Object |
compareAndExchangeRelease |
Атомарно устанавливает значение переменной в newValue с семантикой памяти метода setRelease(Object...), если текущее значение переменной, называемое значением-свидетелем, == expectedValue, полученное с семантикой памяти метода get(Object...). |
final boolean |
compareAndSet |
Атомарно устанавливает значение переменной в newValue с семантикой памяти метода setVolatile(Object...), если текущее значение переменной, называемое значением-свидетелем, == expectedValue, полученное с семантикой памяти метода getVolatile(Object...). |
List |
coordinateTypes() |
Возвращает типы координат для данного VarHandle. |
Optional |
describeConstable() |
Возвращает номинальный дескриптор данного экземпляра, если его можно создать, или пустой Optional, если создать его невозможно. |
static void |
fullFence() |
Гарантирует, что загрузки и сохранения, выполненные до барьера, не будут переупорядочены относительно загрузок и сохранений после барьера. |
final Object |
get |
Возвращает значение переменной с семантикой памяти, соответствующей чтению так, как если бы переменная была объявлена не- volatile. |
final Object |
getAcquire |
Возвращает значение переменной и гарантирует, что последующие загрузки и сохранения не будут переупорядочены перед этим обращением. |
final Object |
getAndAdd |
Атомарно прибавляет value к текущему значению переменной с семантикой памяти метода setVolatile(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода getVolatile(Object...). |
final Object |
getAndAddAcquire |
Атомарно прибавляет value к текущему значению переменной с семантикой памяти метода set(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода getAcquire(Object...). |
final Object |
getAndAddRelease |
Атомарно прибавляет value к текущему значению переменной с семантикой памяти метода setRelease(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода get(Object...). |
final Object |
getAndBitwiseAnd |
Атомарно устанавливает значение переменной в результат побитового И между текущим значением переменной и mask с семантикой памяти метода setVolatile(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода getVolatile(Object...). |
final Object |
getAndBitwiseAndAcquire |
Атомарно устанавливает значение переменной в результат побитового И между текущим значением переменной и mask с семантикой памяти метода set(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода getAcquire(Object...). |
final Object |
getAndBitwiseAndRelease |
Атомарно устанавливает значение переменной в результат побитового И между текущим значением переменной и mask с семантикой памяти метода setRelease(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода get(Object...). |
final Object |
getAndBitwiseOr |
Атомарно устанавливает значение переменной в результат побитового ИЛИ между текущим значением переменной и mask с семантикой памяти метода setVolatile(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода getVolatile(Object...). |
final Object |
getAndBitwiseOrAcquire |
Атомарно устанавливает значение переменной в результат побитового ИЛИ между текущим значением переменной и mask с семантикой памяти метода set(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода getAcquire(Object...). |
final Object |
getAndBitwiseOrRelease |
Атомарно устанавливает значение переменной в результат побитового ИЛИ между текущим значением переменной и mask с семантикой памяти метода setRelease(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода get(Object...). |
final Object |
getAndBitwiseXor |
Атомарно устанавливает значение переменной в результат побитового исключающего ИЛИ между текущим значением переменной и mask с семантикой памяти метода setVolatile(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода getVolatile(Object...). |
final Object |
getAndBitwiseXorAcquire |
Атомарно устанавливает значение переменной в результат побитового исключающего ИЛИ между текущим значением переменной и mask с семантикой памяти метода set(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода getAcquire(Object...). |
final Object |
getAndBitwiseXorRelease |
Атомарно устанавливает значение переменной в результат побитового исключающего ИЛИ между текущим значением переменной и mask с семантикой памяти метода setRelease(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода get(Object...). |
final Object |
getAndSet |
Атомарно устанавливает значение переменной в newValue с семантикой памяти метода setVolatile(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода getVolatile(Object...). |
final Object |
getAndSetAcquire |
Атомарно устанавливает значение переменной в newValue с семантикой памяти метода set(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода getAcquire(Object...). |
final Object |
getAndSetRelease |
Атомарно устанавливает значение переменной в newValue с семантикой памяти метода setRelease(Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти метода get(Object...). |
final Object |
getOpaque |
Возвращает значение переменной в порядке выполнения программы, но без гарантий эффектов упорядочения памяти относительно других потоков. |
final Object |
getVolatile |
Возвращает значение переменной с семантикой памяти, соответствующей чтению так, как если бы переменная была объявлена volatile. |
boolean |
hasInvokeExactBehavior() |
Возвращает true, если для данного VarHandle используется точное поведение вызова. |
boolean |
isAccessModeSupported |
Возвращает true, если указанный режим доступа поддерживается, и false в противном случае. |
static void |
loadLoadFence() |
Гарантирует, что загрузки, выполненные до барьера, не будут переупорядочены относительно загрузок после барьера. |
static void |
releaseFence() |
Гарантирует, что загрузки и сохранения, выполненные до барьера, не будут переупорядочены относительно сохранений после барьера. |
final void |
set |
Устанавливает значение переменной в newValue с семантикой памяти, соответствующей записи так, как если бы переменная была объявлена не-volatile и не-final. |
final void |
setOpaque |
Устанавливает значение переменной в newValue в порядке выполнения программы, но без гарантий эффектов упорядочения памяти относительно других потоков. |
final void |
setRelease |
Устанавливает значение переменной в newValue и гарантирует, что предшествующие загрузки и сохранения не будут переупорядочены после этого обращения. |
final void |
setVolatile |
Устанавливает значение переменной в newValue с семантикой памяти, соответствующей записи так, как если бы переменная была объявлена volatile. |
static void |
storeStoreFence() |
Гарантирует, что сохранения, выполненные до барьера, не будут переупорядочены относительно сохранений после барьера. |
MethodHandle |
toMethodHandle |
Получает дескриптор метода, связанный с данным VarHandle и указанным режимом доступа. |
final String |
toString() |
Возвращает краткое текстовое описание данного VarHandle, включая тип описываемой переменной и описание её координат. |
Class |
varType() |
Возвращает тип переменных, на которые ссылается данный VarHandle. |
final boolean |
weakCompareAndSet |
Возможно, атомарно устанавливает значение переменной в newValue с семантикой памяти метода setVolatile(Object...), если текущее значение переменной, называемое значением-свидетелем, == expectedValue, полученное с семантикой памяти метода getVolatile(Object...). |
final boolean |
weakCompareAndSetAcquire |
Возможно, атомарно устанавливает значение переменной в newValue с семантикой метода set(Object...), если текущее значение переменной, называемое значением-свидетелем, == expectedValue, полученное с семантикой памяти метода getAcquire(Object...). |
final boolean |
weakCompareAndSetPlain |
Возможно, атомарно устанавливает значение переменной в newValue с семантикой метода set(Object...), если текущее значение переменной, называемое значением-свидетелем, == expectedValue, полученное с семантикой памяти метода get(Object...). |
final boolean |
weakCompareAndSetRelease |
Возможно, атомарно устанавливает значение переменной в newValue с семантикой метода setRelease(Object...), если текущее значение переменной, называемое значением-свидетелем, == expectedValue, полученное с семантикой памяти метода get(Object...). |
abstract VarHandle |
withInvokeBehavior() |
Возвращает VarHandle, обеспечивающий доступ к той же переменной или тем же переменным, что и данный VarHandle, но с поведением вызова методов режимов доступа, настроенным на поведение вызова. |
abstract VarHandle |
withInvokeExactBehavior() |
Возвращает VarHandle, обеспечивающий доступ к той же переменной или тем же переменным, что и данный VarHandle, но с поведением вызова методов режимов доступа, настроенным на точное поведение вызова. |
Подробное описание методов
hasInvokeExactBehavior
public boolean hasInvokeExactBehavior()
true, если этот VarHandle имеет поведение invoke-exact.- Возвращает:
-
true, если этот VarHandle имеет поведение invoke-exact. - Начиная с:
- 16
- См. также:
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— если тип режима доступа соответствует символьному дескриптору типа вызывающего кода, но приведение ссылки завершается неудачей. - См. также:
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— если тип режима доступа совместим с символьным дескриптором типа вызывающего кода, но приведение ссылки завершается неудачей. - См. также:
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— если тип режима доступа соответствует символьному дескриптору типа вызывающего кода, но приведение ссылки завершается неудачей. - См. также:
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— если тип режима доступа соответствует символьному дескриптору типа вызывающего кода, но приведение ссылки завершается неудачей. - См. также:
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— если тип режима доступа соответствует символьному дескриптору типа вызывающего кода, но приведение ссылки завершается неудачей. - См. также:
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— если тип режима доступа соответствует символьному дескриптору типа вызывающего кода, но приведение ссылки завершается неудачей. - См. также:
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— если тип режима доступа соответствует символьному дескриптору типа вызывающего кода, но приведение ссылки завершается неудачей. - См. также:
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— если тип режима доступа соответствует символьному дескриптору типа вызывающего кода, но приведение ссылки завершается неудачей. - См. также:
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— если тип режима доступа соответствует символьному дескриптору типа вызывающего кода, но приведение ссылки завершается неудачей. - См. также:
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— если тип режима доступа соответствует символьному дескриптору типа вызывающего кода, но приведение ссылки завершается неудачей. - См. также:
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— если тип режима доступа совпадает с символьным дескриптором типа вызывающего кода, но приведение ссылки завершается ошибкой. - См. также:
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— если тип режима доступа совпадает с символьным дескриптором типа вызывающего кода, но приведение ссылки завершается ошибкой. - См. также:
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— если тип режима доступа совпадает с символьным дескриптором типа вызывающего кода, но приведение ссылки завершается ошибкой. - См. также:
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— если тип режима доступа совпадает с символьным дескриптором типа вызывающего кода, но приведение ссылки завершается ошибкой. - См. также:
getAndBitwiseOr
public final Object getAndBitwiseOr(Object... args)
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— если тип режима доступа совпадает с символьным дескриптором типа вызывающего кода, но приведение ссылки завершается ошибкой. - См. также:
getAndBitwiseOrAcquire
public final Object getAndBitwiseOrAcquire(Object... args)
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— если тип режима доступа совпадает с символьным дескриптором типа вызывающего кода, но приведение ссылки завершается ошибкой. - См. также:
getAndBitwiseOrRelease
public final Object getAndBitwiseOrRelease(Object... args)
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— если тип режима доступа совпадает с символьным дескриптором типа вызывающего кода, но приведение ссылки завершается ошибкой. - См. также:
getAndBitwiseAnd
public final Object getAndBitwiseAnd(Object... args)
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— если тип режима доступа совпадает с символьным дескриптором типа вызывающего кода, но приведение ссылки завершается ошибкой. - См. также:
getAndBitwiseAndAcquire
public final Object getAndBitwiseAndAcquire(Object... args)
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— если тип режима доступа совпадает с символьным дескриптором типа вызывающего кода, но приведение ссылки завершается ошибкой. - См. также:
getAndBitwiseAndRelease
public final Object getAndBitwiseAndRelease(Object... args)
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— если тип режима доступа совпадает с символьным дескриптором типа вызывающего кода, но приведение ссылки завершается ошибкой. - См. также:
getAndBitwiseXor
public final Object getAndBitwiseXor(Object... args)
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— если тип режима доступа совпадает с символьным дескриптором типа вызывающего кода, но приведение ссылки завершается ошибкой. - См. также:
getAndBitwiseXorAcquire
public final Object getAndBitwiseXorAcquire(Object... args)
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— если тип режима доступа совпадает с символьным дескриптором типа вызывающего кода, но приведение ссылки завершается ошибкой. - См. также:
getAndBitwiseXorRelease
public final Object getAndBitwiseXorRelease(Object... args)
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— если тип режима доступа совпадает с символьным дескриптором типа вызывающего кода, но приведение ссылки завершается ошибкой. - См. также:
withInvokeExactBehavior
public abstract VarHandle withInvokeExactBehavior()
Если этот VarHandle уже использует поведение точного вызова, возвращается этот же VarHandle.
Гарантируется, что вызов hasInvokeExactBehavior() для возвращённого дескриптора var вернёт true.
- Примечание API:
- Поведение точного вызова гарантирует, что при вызове метода режима доступа типы и количество аргументов должны соответствовать
access mode type, иначе будет выброшено исключениеWrongMethodTypeException. - Возвращает:
- VarHandle с поведением точного вызова
- Начиная с версии:
- 16
- См. также:
withInvokeBehavior
public abstract VarHandle withInvokeBehavior()
Если этот VarHandle уже использует поведение вызова, возвращается этот же VarHandle.
Гарантируется, что вызов hasInvokeExactBehavior() для возвращённого дескриптора var вернёт false.
- Возвращает:
- VarHandle с поведением вызова
- Начиная с версии:
- 16
- См. также:
toString
varType
public Class<?> varType()
- Возвращает:
- тип переменных, на которые ссылается этот VarHandle
coordinateTypes
public List<Class<?>> coordinateTypes()
- Возвращает:
- типы координат этого VarHandle. Возвращаемый список нельзя изменить
accessModeType
public final MethodType accessModeType(VarHandle.AccessMode accessMode)
Типы параметров типа режима доступа состоят из префикса — типов координат этого VarHandle, за которым следуют дополнительные типы, определяемые методом режима доступа. Тип возвращаемого значения типа режима доступа определяется возвращаемым типом метода режима доступа.
- Параметры:
-
accessMode— режим доступа, соответствующий полиморфному по сигнатуре методу с таким же именем - Возвращает:
- тип режима доступа для заданного режима доступа
isAccessModeSupported
public boolean isAccessModeSupported(VarHandle.AccessMode accessMode)
true, если заданный режим доступа поддерживается, и false в противном случае. Возвращаемое значение false для заданного режима доступа означает, что при вызове соответствующего метода режима доступа выбрасывается UnsupportedOperationException.
- Параметры:
-
accessMode— режим доступа, соответствующий полиморфному по сигнатуре методу с таким же именем - Возвращает:
-
true, если заданный режим доступа поддерживается, иfalseв противном случае.
toMethodHandle
public MethodHandle toMethodHandle(VarHandle.AccessMode accessMode)
- Примечание 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()
© 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