Класс 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 бит, и не накладывают никаких наблюдаемых ограничений порядка с точки зрения других потоков, кроме исполняющего потока. Непрозрачные операции являются побитово атомными и согласованно упорядоченными по отношению к обращениям к той же переменной. В дополнение к соблюдению свойств непрозрачности, 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, - побитовые атомарные режимы доступа для обновления, которые, например, атомарно получают и побитово ИЛИ значение переменной с учётом указанных эффектов упорядочения памяти. Множество соответствующих методов режима доступа в этой группе включает методы
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 Memory Model может допускать неожиданные результаты.
В дополнение к поддержке доступа к переменным в различных режимах доступа, также предоставляется набор статических методов, называемых методами заграждения памяти, для тонкого управления упорядочением памяти. Спецификация языка Java допускает другим потокам наблюдать операции так, как будто они выполнялись в порядке, отличном от очевидного порядка исходного кода программы, в зависимости от ограничений, например, возникающих от использования блокировок, volatile полей или VarHandle. Статические методы fullFence, acquireFence, releaseFence, loadLoadFence и storeStoreFence также могут быть использованы для наложения ограничений. Их спецификации, как и в случае с определёнными режимами доступа, сформулированы в терминах отсутствия «переупорядочений» — наблюдаемых эффектов упорядочения, которые в противном случае могли бы произойти, если бы заграждение не было присутствующим. Более точная формулировка спецификации методов режима доступа и методов заграждения памяти может сопровождать будущие обновления спецификации языка Java.
Компиляция вызова методов режима доступа
Object аргументов и Object типов возвращаемых значений (если тип возвращаемого значения полиморфен), но у них есть дополнительное свойство, называемое полиморфизмом сигнатуры, которое связывает эту свободу вызова непосредственно со стеком выполнения JVM. Как обычно для виртуальных методов, вызовы на уровне исходного кода к методам режима доступа компилируются в инструкцию invokevirtual. Более необычно, компилятор должен записывать фактические типы аргументов и не может выполнять преобразования вызовов методов над аргументами. Вместо этого он должен генерировать инструкции для их помещения в стек в соответствии с их собственными необработанными типами. Объект VarHandle сам будет помещен в стек перед аргументами. Затем компилятор генерирует инструкцию invokevirtual, которая вызывает метод режима доступа с символическим описателем типа, описывающим типы аргументов и возвращаемого значения.
Для выдачи полного символического описателя типа компилятор также должен определить тип возвращаемого значения (если он полиморфен). Это основано на приведении типа в выражении вызова метода, если оно есть, или же Object, если вызов является выражением, или же void, если вызов является оператором. Приведение может быть к примитивному типу (но не void).
В качестве частного случая, неприведённому null аргументу присваивается символический описатель типа java.lang.Void. Неопределённость с типом Void не имеет последствий, так как нет ссылок типа Void, кроме нулевой ссылки.
Вызов методов режима доступа
В первый раз при выполнении инструкцииinvokevirtual она связывается путём символического разрешения имён в инструкции и проверки того, что вызов метода статически законен. Это также относится к вызовам методов режима доступа. В этом случае символический описатель типа, выдаваемый компилятором, проверяется на корректность синтаксиса, и содержащиеся в нём имена разрешаются. Таким образом, инструкция invokevirtual, вызывающая метод режима доступа, всегда будет связана, если символический описатель типа имеет правильный синтаксис и типы существуют. Когда после связывания выполняется invokevirtual, получающий тип VarHandle сначала проверяется JVM, чтобы убедиться, что он соответствует символическому описателю типа. Если соответствие типа не удаётся, это означает, что метод режима доступа, который вызывает вызывающий объект, не присутствует на индивидуальном VarHandle, к которому осуществляется вызов.
Вызов метода режима доступа по умолчанию ведёт себя так, как если бы вызов MethodHandle.invoke(java.lang.Object...), где получающий метод handle принимает экземпляр 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)
, где в этом случае метод handle привязан к экземпляру VarHandle. Поведение вызова VarHandle можно настроить (см. withInvokeExactBehavior()) таким образом, что вызов метода режима доступа ведёт себя так, как если бы вызов MethodHandle.invokeExact(java.lang.Object...), где получающий метод handle принимает экземпляр 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)
, где в этом случае метод handle привязан к экземпляру VarHandle. Проверка вызова
В типичных программах соответствие типа режима доступа VarHandle обычно выполняется успешно. Но если соответствие не выполняется, JVM выброситWrongMethodTypeException. Таким образом, несовпадение типа режима доступа, которое может проявляться как ошибка связывания в статически типизированной программе, может проявляться как динамическая WrongMethodTypeException в программе, использующей VarHandle.
Поскольку типы режимов доступа VarHandle содержат «живые» Class объекты, соответствие типа метода учитывает как имена типов, так и загрузчики классов. Таким образом, даже если VarHandle VH создан в одном загрузчике классов L1 и используется в другом L2, вызовы методов режима доступа VarHandle являются типобезопасными, потому что символический описатель типа вызывающего объекта, как разрешённый в L2, сопоставляется со символическим описателем типа исходного метода вызываемого объекта, как разрешённым в L1. Разрешение в L1 происходит, когда VH создаётся и его типы доступа назначаются, в то время как разрешение в L2 происходит, когда инструкция invokevirtual связывается.
Помимо проверок описателей типов, возможность VarHandles получать доступ к своим переменным не ограничена. Если VarHandle сформирован на непубличной переменной классом, имеющим доступ к этой переменной, полученный VarHandle можно использовать в любом месте любым вызывающим объектом, который получает ссылку на него.
В отличие от Core Reflection API, где проверка доступа выполняется каждый раз при вызове рефлексивного метода, проверка доступа VarHandle выполняется при создании VarHandle. Таким образом, VarHandles к непубличным переменным или переменным в непубличных классах, как правило, следует хранить в секрете. Их не следует передавать недоверенному коду, если их использование недоверенным кодом не будет безопасно.
Создание VarHandle
Код Java может создать VarHandle, который напрямую получает доступ к любому полю, доступному для этого кода. Это делается через рефлексивный API на основе возможностей, называемыйMethodHandles.Lookup. Например, VarHandle для нестатического поля можно получить из Lookup.findVarHandle. Также есть метод преобразования из объектов Core Reflection API, Lookup.unreflectVarHandle. Доступ к защищённым членам поля ограничен только получателями из того же класса или одного из его подклассов, а сам класс также должен быть подклассом (или братом по пакету) определяющего класс защищённого члена. Если VarHandle ссылается на защищённое нестатическое поле класса-объявителя за пределами текущего пакета, аргумент получателя будет сужен до типа класса, выполняющего доступ.
Взаимодействие между VarHandles и Core Reflection API
Используя фабричные методы в APILookup, любое поле, представленное объектом Core Reflection API, можно преобразовать в поведенчески эквивалентный VarHandle. Например, рефлексивное Field можно преобразовать в VarHandle с помощью Lookup.unreflectVarHandle. Полученные VarHandles, как правило, обеспечивают более прямой и эффективный доступ к соответствующим полям. В качестве специального случая, когда 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).
Взаимодействие между VarHandles и Java-обобщениями
invokevirtual инструкции.- Since:
- 9
- See Also:
Краткое описание вложенных классов
| Модификатор и тип | Класс | Описание |
|---|---|---|
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 есть поведение вызова с точным значением. |
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, но поведение вызова методов режимов доступа скорректировано на поведение вызова. |
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(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.
- Параметры:
-
args— полиморфный список параметров подписи вида(CT1 ct1, ..., CTn ctn, T mask), статически представленный с помощью varargs. - Возвращает:
- полиморфный результат, представляющий предыдущее значение переменной, статически представленный с помощью
Object. - Исключение:
-
UnsupportedOperationException— если режим доступа не поддерживается для этого VarHandle. -
WrongMethodTypeException— если тип режима доступа не соответствует символьному типу описания вызывающей стороны. -
ClassCastException— если тип режима доступа соответствует символьному типу описания вызывающей стороны, но преобразование ссылки не выполнено. - См. также:
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.
- Параметры:
-
args— полиморфный список параметров подписи вида(CT1 ct1, ..., CTn ctn, T mask), статически представленный с помощью varargs. - Возвращает:
- полиморфный результат, представляющий предыдущее значение переменной, статически представленный с помощью
Object. - Исключение:
-
UnsupportedOperationException— если режим доступа не поддерживается для этого VarHandle. -
WrongMethodTypeException— если тип режима доступа не соответствует символьному типу описания вызывающей стороны. -
ClassCastException— если тип режима доступа соответствует символьному типу описания вызывающей стороны, но преобразование ссылки не выполнено. - См. также:
getAndBitwiseXor
public final Object getAndBitwiseXor(Object... args)
mask с семантикой памяти setVolatile(java.lang.Object...) и возвращает предыдущее значение переменной, как обращается с семантикой памяти getVolatile(java.lang.Object...). Если тип переменной — нецелочисленный тип boolean, то выполняется логическое ИСКЛЮЧАЮЩЕЕ ИЛИ вместо побитового ИСКЛЮЧАЮЩЕГО ИЛИ.
Подпись метода имеет вид (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(java.lang.Object...) и возвращает предыдущее значение переменной, как обращается с семантикой памяти getAcquire(java.lang.Object...). Если тип переменной — нецелочисленный тип boolean, то выполняется логическое ИСКЛЮЧАЮЩЕЕ ИЛИ вместо побитового ИСКЛЮЧАЮЩЕГО ИЛИ.
Подпись метода имеет вид (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(java.lang.Object...) и возвращает предыдущее значение переменной, как обращается с семантикой памяти get(java.lang.Object...). Если тип переменной — нецелочисленный тип boolean, то выполняется логическое ИСКЛЮЧАЮЩЕЕ ИЛИ вместо побитового ИСКЛЮЧАЮЩЕГО ИЛИ.
Подпись метода имеет вид (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 уже есть поведение invoke-exact, то возвращается этот VarHandle.
Вызов hasInvokeExactBehavior() на возвращенном var handle гарантированно вернет true.
- Замечание API:
- Поведение invoke-exact гарантирует, что при вызове метода режима доступа типы и арность аргументов должны соответствовать
access mode type, в противном случае будет выброшено исключениеWrongMethodTypeException. - Возвращает:
- VarHandle с поведением invoke-exact
- С:
- 16
- См. также:
с поведением вызова
public abstract VarHandle withInvokeBehavior()
Если у этого VarHandle уже есть поведение вызова, возвращается этот VarHandle.
Вызов hasInvokeExactBehavior() на возвращаемом обработчике переменных гарантированно вернёт 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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/lang/invoke/VarHandle.html