Класс VarHandle
- Все реализованные интерфейсы:
Constable
public abstract sealed class VarHandle extends Object implements Constable
VarHandle неизменяемы и не имеют видимого состояния. VarHandle не могут быть подклассами пользователя.
VarHandle имеет:
- тип
variable typeT, тип каждой переменной, на которую ссылается этот VarHandle; и - список
coordinate typesCT1, CT2, ..., CTn, типы выражений координат, которые совместно определяют местоположение переменной, на которую ссылается этот VarHandle.
Class. Список типов координат может быть пустым. Методы фабрики, которые производят или lookup экземпляры VarHandle, документируют поддерживаемый тип переменной и список типов координат.
Каждый режим доступа связан с одним методом режима доступа, полиморфным по сигнатуре методом, названным в соответствии с режимом доступа. Когда метод режима доступа вызывается для экземпляра VarHandle, начальными аргументами вызова являются выражения координат, которые точно указывают, в каком объекте должна происходить доступ к переменной. Конечные аргументы вызова представляют значения, важные для режима доступа. Например, различные режимы сравнения и установки или сравнения и обмена требуют два конечных аргумента для ожидаемого значения переменной и нового значения.
Арность и типы аргументов вызова метода режима доступа не проверяются статически. Вместо этого каждый метод режима доступа указывает access mode type, представленный как экземпляр MethodType, который служит своего рода сигнатурой метода, с помощью которой динамически проверяются аргументы. Тип режима доступа предоставляет формальные типы параметров в терминах типов координат экземпляра VarHandle и типов значений, важных для режима доступа. Тип режима доступа также предоставляет тип возвращаемого значения, часто в терминах типа переменной экземпляра VarHandle. Когда метод режима доступа вызывается для экземпляра VarHandle, символическое описание типа в месте вызова, типы аргументов вызова во время выполнения и тип возвращаемого значения во время выполнения должны соответствовать типам, указанным в типе режима доступа. В случае несоответствия будет выброшено исключение во время выполнения. Например, метод режима доступа compareAndSet(java.lang.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 бит и не накладывают наблюдаемых ограничений порядка относительно других потоков, кроме выполняемого потока. Непрозрачные операции являются битовыми атомарными и согласованно упорядоченными относительно доступа к той же переменной. В дополнение к соблюдению свойств непрозрачных операций, считывания в режиме приобретения и последующие операции упорядочены после соответствующих операций записи в режиме высвобождения и предыдущих операций. В дополнение к соблюдению свойств приобретения и высвобождения все операции volatile полностью упорядочены друг относительно друга.
Режимы доступа сгруппированы в следующие категории:
- режимы доступа для чтения, которые получают значение переменной с учётом указанных эффектов упорядочения памяти. Набор соответствующих методов режима доступа, входящих в эту группу, состоит из методов
get,getVolatile,getAcquire,getOpaque. - режимы доступа для записи, которые устанавливают значение переменной с учётом указанных эффектов упорядочения памяти. Набор соответствующих методов режима доступа, входящих в эту группу, состоит из методов
set,setVolatile,setRelease,setOpaque. - атомарные режимы доступа для обновления, которые, например, атомарно сравнивают и устанавливают значение переменной с учётом указанных эффектов упорядочения памяти. Набор соответствующих методов режима доступа, входящих в эту группу, состоит из методов
compareAndSet,weakCompareAndSetPlain,weakCompareAndSet,weakCompareAndSetAcquire,weakCompareAndSetRelease,compareAndExchangeAcquire,compareAndExchange,compareAndExchangeRelease,getAndSet,getAndSetAcquire,getAndSetRelease. - численные атомарные режимы доступа для обновления, которые, например, атомарно получают и устанавливают с добавлением значения переменной с учётом указанных эффектов упорядочения памяти. Набор соответствующих методов режима доступа, входящих в эту группу, состоит из методов
getAndAdd,getAndAddAcquire,getAndAddRelease, - битовые атомарные режимы доступа для обновления, которые, например, атомарно получают и побитово ИЛИ значение переменной с учётом указанных эффектов упорядочения памяти. Набор соответствующих методов режима доступа, входящих в эту группу, состоит из методов
getAndBitwiseOr,getAndBitwiseOrAcquire,getAndBitwiseOrRelease,getAndBitwiseAnd,getAndBitwiseAndAcquire,getAndBitwiseAndRelease,getAndBitwiseXor,getAndBitwiseXorAcquire,getAndBitwiseXorRelease.
Методы фабрики, которые производят или lookup экземпляры VarHandle, документируют набор поддерживаемых режимов доступа, который может также включать документацию ограничений, основанных на типе переменной и том, является ли переменная только для чтения. Если режим доступа не поддерживается, то соответствующий метод режима доступа при вызове выбросит 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.
Компиляция вызова методов режима доступа
Object аргументов и Object типов возврата (если тип возврата полиморфен), но у них есть дополнительное свойство, называемое полиморфизмом сигнатуры, которое связывает эту свободу вызова непосредственно со стеком выполнения JVM. Как обычно для виртуальных методов, вызовы методов режима доступа на уровне исходного кода компилируются в инструкцию invokevirtual. Более необычно, компилятор должен записывать фактические типы аргументов и не может выполнять преобразования вызова метода для аргументов. Вместо этого он должен сгенерировать инструкции для их помещения на стек в соответствии с их собственными не преобразованными типами. Объект VarHandle сам будет помещен на стек перед аргументами. Затем компилятор генерирует инструкцию invokevirtual, которая вызывает метод режима доступа со символическим описателем типа, описывающим типы аргументов и возврата.
Для выдачи полного символического описателя типа компилятор также должен определить тип возврата (если он полиморфен). Это основано на приведении типа в выражении вызова метода, если оно есть, или же Object, если вызов является выражением, или же void, если вызов является оператором. Приведение может быть к примитивному типу (но не void).
В качестве граничного случая, неприведённому null аргументу присваивается символическое описание типа java.lang.Void. Неопределённость с типом Void не вредна, так как нет ссылок типа Void за исключением ссылки null.
Выполнение вызова методов режима доступа
В первый раз, когда выполняется инструкцияinvokevirtual, она связывается путём символического разрешения имён в инструкции и проверки того, что вызов метода статически допустим. Это также относится к вызовам методов режима доступа. В этом случае символический описатель типа, выпущенный компилятором, проверяется на правильность синтаксиса, и имена, содержащиеся в нём, разрешаются. Таким образом, инструкция invokevirtual, которая вызывает метод режима доступа, всегда будет связана, если символический описатель типа имеет правильный синтаксис и типы существуют. Когда инструкция invokevirtual выполняется после связи, JVM сначала проверяет тип режима доступа получающего VarHandle, чтобы убедиться, что он соответствует символическому описателю типа. Если проверка типа завершается неудачно, это означает, что метод режима доступа, который вызывает вызывающий объект, отсутствует в конкретном VarHandle, который вызывается.
Вызов метода режима доступа по умолчанию ведёт себя так, как если бы был вызов MethodHandle.invoke(java.lang.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(java.lang.Object...), так как перед вызовом целевого объекта обработчик применит необходимые преобразования ссылок и преобразует, упакует или расширит примитивные значения, как если бы посредством asType (см. также MethodHandles.varHandleInvoker(java.lang.invoke.VarHandle.AccessMode, java.lang.invoke.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(java.lang.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. Таким образом, несоответствие типа режима доступа, которое может проявляться как ошибка связывания в статически типизированной программе, может проявляться как динамическая WrongMethodTypeException в программе, использующей VarHandle.
Поскольку типы режима доступа содержат "живые" 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(java.lang.invoke.VarHandle.AccessMode, java.lang.invoke.MethodType) или MethodHandles.varHandleInvoker(java.lang.invoke.VarHandle.AccessMode, java.lang.invoke.MethodType). API Lookup.findVirtual также может вернуть обработчик метода для вызова метода режима доступа для любого указанного типа режима доступа и эквивалентен по поведению MethodHandles.varHandleInvoker(java.lang.invoke.VarHandle.AccessMode, java.lang.invoke.MethodType).
Взаимодействие между VarHandle и дженериками Java
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(java.lang.Object...), если текущее значение переменной, называемое значением-свидетелем, == expectedValue, доступное с семантикой памяти getVolatile(java.lang.Object...). |
final Object |
compareAndExchangeAcquire |
Атомарно устанавливает значение переменной в newValue с семантикой памяти set(java.lang.Object...), если текущее значение переменной, называемое значением-свидетелем, == expectedValue, доступное с семантикой памяти getAcquire(java.lang.Object...). |
final Object |
compareAndExchangeRelease |
Атомарно устанавливает значение переменной в newValue с семантикой памяти setRelease(java.lang.Object...), если текущее значение переменной, называемое значением-свидетелем, == expectedValue, доступное с семантикой памяти get(java.lang.Object...). |
final boolean |
compareAndSet |
Атомарно устанавливает значение переменной в newValue с семантикой памяти setVolatile(java.lang.Object...), если текущее значение переменной, называемое значением-свидетелем, == expectedValue, доступное с семантикой памяти getVolatile(java.lang.Object...). |
List |
coordinateTypes() |
Возвращает типы координат для этого VarHandle. |
Optional |
describeConstable() |
Возвращает номинальный дескриптор для этого экземпляра, если он может быть создан, или пустой Optional, если он не может быть создан. |
static void |
fullFence() |
Гарантирует, что загрузки и сохранения до забора не будут переупорядочены с загрузками и сохранениями после забора. |
final Object |
get |
Возвращает значение переменной с семантикой памяти чтения, как если бы переменная была объявлена не- volatile. |
final Object |
getAcquire |
Возвращает значение переменной и гарантирует, что последующие загрузки и сохранения не будут переупорядочены перед этим доступом. |
final Object |
getAndAdd |
Атомарно добавляет value к текущему значению переменной с семантикой памяти setVolatile(java.lang.Object...) и возвращает предыдущее значение переменной, доступное с семантикой памяти getVolatile(java.lang.Object...). |
final Object |
getAndAddAcquire |
Атомарно добавляет value к текущему значению переменной с семантикой памяти set(java.lang.Object...) и возвращает предыдущее значение переменной, доступное с семантикой памяти getAcquire(java.lang.Object...). |
final Object |
getAndAddRelease |
Атомарно добавляет value к текущему значению переменной с семантикой памяти setRelease(java.lang.Object...) и возвращает предыдущее значение переменной, доступное с семантикой памяти get(java.lang.Object...). |
final Object |
getAndBitwiseAnd |
Атомарно устанавливает значение переменной в результат побитового И между текущим значением переменной и mask с семантикой памяти setVolatile(java.lang.Object...) и возвращает предыдущее значение переменной, доступное с семантикой памяти getVolatile(java.lang.Object...). |
final Object |
getAndBitwiseAndAcquire |
Атомарно устанавливает значение переменной в результат побитового И между текущим значением переменной и mask с семантикой памяти set(java.lang.Object...) и возвращает предыдущее значение переменной, доступное с семантикой памяти getAcquire(java.lang.Object...). |
final Object |
getAndBitwiseAndRelease |
Атомарно устанавливает значение переменной в результат побитового И между текущим значением переменной и mask с семантикой памяти setRelease(java.lang.Object...) и возвращает предыдущее значение переменной, доступное с семантикой памяти get(java.lang.Object...). |
final Object |
getAndBitwiseOr |
Атомарно устанавливает значение переменной в результат побитового ИЛИ между текущим значением переменной и mask с семантикой памяти setVolatile(java.lang.Object...) и возвращает предыдущее значение переменной, доступное с семантикой памяти getVolatile(java.lang.Object...). |
final Object |
getAndBitwiseOrAcquire |
Атомарно устанавливает значение переменной в результат побитового ИЛИ между текущим значением переменной и mask с семантикой памяти set(java.lang.Object...) и возвращает предыдущее значение переменной, доступное с семантикой памяти getAcquire(java.lang.Object...). |
final Object |
getAndBitwiseOrRelease |
Атомарно устанавливает значение переменной в результат побитового ИЛИ между текущим значением переменной и mask с семантикой памяти setRelease(java.lang.Object...) и возвращает предыдущее значение переменной, доступное с семантикой памяти get(java.lang.Object...). |
final Object |
getAndBitwiseXor |
Атомарно устанавливает значение переменной в результат побитового XOR между текущим значением переменной и mask с семантикой памяти setVolatile(java.lang.Object...) и возвращает предыдущее значение переменной, доступное с семантикой памяти getVolatile(java.lang.Object...). |
final Object |
getAndBitwiseXorAcquire |
Атомарно устанавливает значение переменной в результат побитового XOR между текущим значением переменной и mask с семантикой памяти set(java.lang.Object...) и возвращает предыдущее значение переменной, доступное с семантикой памяти getAcquire(java.lang.Object...). |
final Object |
getAndBitwiseXorRelease |
Атомарно устанавливает значение переменной в результат побитового XOR между текущим значением переменной и mask с семантикой памяти setRelease(java.lang.Object...) и возвращает предыдущее значение переменной, доступное с семантикой памяти get(java.lang.Object...). |
final Object |
getAndSet |
Атомарно устанавливает значение переменной в newValue с семантикой памяти setVolatile(java.lang.Object...) и возвращает предыдущее значение переменной, доступное с семантикой памяти getVolatile(java.lang.Object...). |
final Object |
getAndSetAcquire |
Атомарно устанавливает значение переменной в newValue с семантикой памяти set(java.lang.Object...) и возвращает предыдущее значение переменной, доступное с семантикой памяти getAcquire(java.lang.Object...). |
final Object |
getAndSetRelease |
Атомарно устанавливает значение переменной в newValue с семантикой памяти setRelease(java.lang.Object...) и возвращает предыдущее значение переменной, доступное с семантикой памяти get(java.lang.Object...). |
final Object |
getOpaque |
Возвращает значение переменной, доступное в порядке программы, но без гарантии эффектов упорядочения памяти по отношению к другим потокам. |
final Object |
getVolatile |
Возвращает значение переменной, с семантикой памяти чтения, как если бы переменная была объявлена volatile. |
boolean |
hasInvokeExactBehavior() |
Возвращает true если у этого VarHandle есть поведение invoke-exact. |
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(java.lang.Object...), если текущее значение переменной, называемое свидетельским значением, == expectedValue, как доступно с семантикой памяти getVolatile(java.lang.Object...). |
final boolean |
weakCompareAndSetAcquire |
Возможно атомарно устанавливает значение переменной в newValue со семантикой set(java.lang.Object...), если текущее значение переменной, называемое свидетельским значением, == expectedValue, как доступно с семантикой памяти getAcquire(java.lang.Object...). |
final boolean |
weakCompareAndSetPlain |
Возможно атомарно устанавливает значение переменной в newValue со семантикой set(java.lang.Object...), если текущее значение переменной, называемое свидетельским значением, == expectedValue, как доступно с семантикой памяти get(java.lang.Object...). |
final boolean |
weakCompareAndSetRelease |
Возможно атомарно устанавливает значение переменной в newValue со семантикой setRelease(java.lang.Object...), если текущее значение переменной, называемое свидетельским значением, == expectedValue, как доступно с семантикой памяти get(java.lang.Object...). |
abstract VarHandle |
withInvokeBehavior() |
Возвращает VarHandle, с доступом к тем же переменным, что и у этого VarHandle, но поведение вызова методов режима доступа изменено на поведение invoke. |
abstract VarHandle |
withInvokeExactBehavior() |
Возвращает VarHandle, с доступом к тем же переменным, что и у этого VarHandle, но поведение вызова методов режима доступа изменено на поведение invoke-exact. |
Подробное описание методов
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(java.lang.Object...), если текущее значение переменной, называемое значением-свидетелем, == expectedValue, как доступно с семантикой памяти getVolatile(java.lang.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(java.lang.Object...), если текущее значение переменной, называемое значением-свидетелем, == expectedValue, как доступно с семантикой памяти getVolatile(java.lang.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(java.lang.Object...), если текущее значение переменной, называемое значением-свидетелем, == expectedValue, как доступно с семантикой памяти getAcquire(java.lang.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(java.lang.Object...), если текущее значение переменной, называемое значением-свидетелем, == expectedValue, как доступно с семантикой памяти get(java.lang.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(java.lang.Object...), если текущее значение переменной, называемое значением-свидетелем, == expectedValue, как доступно с семантикой памяти get(java.lang.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(java.lang.Object...), если текущее значение переменной, называемое значением-свидетелем, == expectedValue, как доступно с семантикой памяти getVolatile(java.lang.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(java.lang.Object...), если текущее значение переменной, называемое значением свидетеля, == expectedValue, как доступно с семантикой памяти getAcquire(java.lang.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(java.lang.Object...), если текущее значение переменной, называемое значением свидетеля, == expectedValue, как доступно с семантикой памяти get(java.lang.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(java.lang.Object...) и возвращает предыдущее значение переменной, как доступно с семантикой памяти getVolatile(java.lang.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(java.lang.Object...) и возвращает предыдущее значение переменной, как доступно с семантикой памяти getAcquire(java.lang.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(java.lang.Object...) и возвращает предыдущее значение переменной, как доступно с семантикой памяти get(java.lang.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(java.lang.Object...) и возвращает предыдущее значение переменной, как доступно с семантикой памяти getVolatile(java.lang.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(java.lang.Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти getAcquire(java.lang.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(java.lang.Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти get(java.lang.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(java.lang.Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти getVolatile(java.lang.Object...). Если тип переменной — нецелочисленный тип boolean, то вместо побитового ИЛИ выполняется логическое ИЛИ.
Подпись метода имеет вид (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(java.lang.Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти getAcquire(java.lang.Object...). Если тип переменной — нецелочисленный тип boolean, то вместо побитового ИЛИ выполняется логическое ИЛИ.
Подпись метода имеет вид (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(java.lang.Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти get(java.lang.Object...). Если тип переменной — нецелочисленный тип boolean, то вместо побитового ИЛИ выполняется логическое ИЛИ.
Подпись метода имеет вид (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(java.lang.Object...) и возвращает предыдущее значение переменной, полученное с семантикой памяти getVolatile(java.lang.Object...). Если тип переменной — нецелочисленный тип boolean, то вместо побитового И выполняется логическое И.
Подпись метода имеет вид (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(java.lang.Object...) и возвращает предыдущее значение переменной, как доступно с семантикой памяти getAcquire(java.lang.Object...). Если тип переменной является нецелочисленным типом boolean, то выполняется логическое И вместо побитового И.
Подпись метода имеет вид (CT1 ct1, ..., CTn ctn, T mask)T.
Символьный тип описателя в месте вызова getAndBitwiseAndAcquire должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_AND_ACQUIRE) для этого VarHandle.
- Parameters:
-
args- список параметров с полиморфной подписью вида(CT1 ct1, ..., CTn ctn, T mask), статически представленный с помощью varargs. - Returns:
- результат с полиморфной подписью, представляющий предыдущее значение переменной, статически представленный с помощью
Object. - Throws:
-
UnsupportedOperationException- если режим доступа не поддерживается для данного VarHandle. -
WrongMethodTypeException- если тип режима доступа не соответствует символьному описателю вызывающего кода. -
ClassCastException- если тип режима доступа соответствует символьному описателю вызывающего кода, но преобразование ссылки не выполняется. - See Also:
getAndBitwiseAndRelease
public final Object getAndBitwiseAndRelease(Object... args)
mask с семантикой памяти setRelease(java.lang.Object...) и возвращает предыдущее значение переменной, как доступно с семантикой памяти get(java.lang.Object...). Если тип переменной является нецелочисленным типом boolean, то выполняется логическое И вместо побитового И.
Подпись метода имеет вид (CT1 ct1, ..., CTn ctn, T mask)T.
Символьный тип описателя в месте вызова getAndBitwiseAndRelease должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_AND_RELEASE) для этого VarHandle.
- Parameters:
-
args- список параметров с полиморфной подписью вида(CT1 ct1, ..., CTn ctn, T mask), статически представленный с помощью varargs. - Returns:
- результат с полиморфной подписью, представляющий предыдущее значение переменной, статически представленный с помощью
Object. - Throws:
-
UnsupportedOperationException- если режим доступа не поддерживается для данного VarHandle. -
WrongMethodTypeException- если тип режима доступа не соответствует символьному описателю вызывающего кода. -
ClassCastException- если тип режима доступа соответствует символьному описателю вызывающего кода, но преобразование ссылки не выполняется. - See Also:
getAndBitwiseXor
public final Object getAndBitwiseXor(Object... args)
mask с семантикой памяти setVolatile(java.lang.Object...) и возвращает предыдущее значение переменной, как доступно с семантикой памяти getVolatile(java.lang.Object...). Если тип переменной является нецелочисленным типом boolean, то выполняется логическое XOR вместо побитового XOR.
Подпись метода имеет вид (CT1 ct1, ..., CTn ctn, T mask)T.
Символьный тип описателя в месте вызова getAndBitwiseXor должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_XOR) для этого VarHandle.
- Parameters:
-
args- список параметров с полиморфной подписью вида(CT1 ct1, ..., CTn ctn, T mask), статически представленный с помощью varargs. - Returns:
- результат с полиморфной подписью, представляющий предыдущее значение переменной, статически представленный с помощью
Object. - Throws:
-
UnsupportedOperationException- если режим доступа не поддерживается для данного VarHandle. -
WrongMethodTypeException- если тип режима доступа не соответствует символьному описателю вызывающего кода. -
ClassCastException- если тип режима доступа соответствует символьному описателю вызывающего кода, но преобразование ссылки не выполняется. - See Also:
getAndBitwiseXorAcquire
public final Object getAndBitwiseXorAcquire(Object... args)
mask с семантикой памяти set(java.lang.Object...) и возвращает предыдущее значение переменной, как доступно с семантикой памяти getAcquire(java.lang.Object...). Если тип переменной является нецелочисленным типом boolean, то выполняется логическое XOR вместо побитового XOR.
Подпись метода имеет вид (CT1 ct1, ..., CTn ctn, T mask)T.
Символьный тип описателя в месте вызова getAndBitwiseXorAcquire должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_XOR_ACQUIRE) для этого VarHandle.
- Parameters:
-
args- список параметров с полиморфной подписью вида(CT1 ct1, ..., CTn ctn, T mask), статически представленный с помощью varargs. - Returns:
- результат с полиморфной подписью, представляющий предыдущее значение переменной, статически представленный с помощью
Object. - Throws:
-
UnsupportedOperationException- если режим доступа не поддерживается для данного VarHandle. -
WrongMethodTypeException- если тип режима доступа не соответствует символьному описателю вызывающего кода. -
ClassCastException- если тип режима доступа соответствует символьному описателю вызывающего кода, но преобразование ссылки не выполняется. - See Also:
getAndBitwiseXorRelease
public final Object getAndBitwiseXorRelease(Object... args)
mask с семантикой памяти setRelease(java.lang.Object...) и возвращает предыдущее значение переменной, как доступно с семантикой памяти get(java.lang.Object...). Если тип переменной является нецелочисленным типом boolean, то выполняется логическое XOR вместо побитового XOR.
Подпись метода имеет вид (CT1 ct1, ..., CTn ctn, T mask)T.
Символьный тип описателя в месте вызова getAndBitwiseXorRelease должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_XOR_RELEASE) для этого VarHandle.
- Parameters:
-
args- список параметров с полиморфной подписью вида(CT1 ct1, ..., CTn ctn, T mask), статически представленный с помощью varargs. - Returns:
- результат с полиморфной подписью, представляющий предыдущее значение переменной, статически представленный с помощью
Object. - Throws:
-
UnsupportedOperationException- если режим доступа не поддерживается для данного VarHandle. -
WrongMethodTypeException- если тип режима доступа не соответствует символьному описателю вызывающего кода. -
ClassCastException- если тип режима доступа соответствует символьному описателю вызывающего кода, но преобразование ссылки не выполняется. - See Also:
withInvokeExactBehavior
public abstract VarHandle withInvokeExactBehavior()
Если у этого VarHandle уже есть поведение invoke-exact, возвращается этот VarHandle.
Вызов hasInvokeExactBehavior() на возвращаемом обработчике переменных гарантированно вернет true.
- API Note:
- Поведение invoke-exact гарантирует, что при вызове метода режима доступа типы и количество аргументов должны соответствовать
access mode type, в противном случае будет выброшено исключениеWrongMethodTypeException. - Returns:
- VarHandle с поведением invoke-exact
- Since:
- 16
- See Also:
withInvokeBehavior
public abstract VarHandle withInvokeBehavior()
Если у этого VarHandle уже есть поведение invoke, возвращается этот VarHandle.
Вызов hasInvokeExactBehavior() на возвращаемом обработчике переменных гарантированно вернет false.
- Returns:
- VarHandle с поведением invoke
- Since:
- 16
- See Also:
toString
public final String toString()
- Overrides:
-
toStringв классеObject - Возвращает:
- Компактное текстовое описание этого VarHandle
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, 2023, 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/21/docs/api/java.base/java/lang/invoke/VarHandle.html