Класс VarHandle
- Все реализованные интерфейсы:
Constable
public abstract 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 arguments and Object return types (if the return type is polymorphic), but they have an additional quality called signature polymorphism which connects this freedom of invocation directly to the JVM execution stack. As is usual with virtual methods, source-level calls to access mode methods compile to an invokevirtual instruction. More unusually, the compiler must record the actual argument types, and may not perform method invocation conversions on the arguments. Instead, it must generate instructions to push them on the stack according to their own unconverted types. The VarHandle object itself will be pushed on the stack before the arguments. The compiler then generates an invokevirtual instruction that invokes the access mode method with a symbolic type descriptor which describes the argument and return types.
To issue a complete symbolic type descriptor, the compiler must also determine the return type (if polymorphic). This is based on a cast on the method invocation expression, if there is one, or else Object if the invocation is an expression, or else void if the invocation is a statement. The cast may be to a primitive type (but not void).
As a corner case, an uncasted null argument is given a symbolic type descriptor of java.lang.Void. The ambiguity with the type Void is harmless, since there are no references of type Void except the null reference.
Выполнение вызова методов доступа
The first time aninvokevirtual instruction is executed it is linked by symbolically resolving the names in the instruction and verifying that the method call is statically legal. This also holds for calls to access mode methods. In this case, the symbolic type descriptor emitted by the compiler is checked for correct syntax, and names it contains are resolved. Thus, an invokevirtual instruction which invokes an access mode method will always link, as long as the symbolic type descriptor is syntactically well-formed and the types exist. When the invokevirtual is executed after linking, the receiving VarHandle's access mode type is first checked by the JVM to ensure that it matches the symbolic type descriptor. If the type match fails, it means that the access mode method which the caller is invoking is not present on the individual VarHandle being invoked.
Вызов метода доступа ведет себя по умолчанию как вызов 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 в программе, использующей VarHandles.
Поскольку типы доступа VarHandle содержат "живые" Class объекты, соответствие типов методов учитывает как имена типов, так и загрузчики классов. Таким образом, даже если VarHandle VH создан в одном загрузчике классов L1 и используется в другом L2, вызовы методов доступа VarHandle являются типобезопасными, поскольку символический тип описателя вызывающего объекта, как разрешенного в L2, сопоставляется с исходным символическим типом описателя метода вызываемого объекта, как разрешенного в L1. Разрешение в L1 происходит при создании VH и присвоении его типов доступа, в то время как разрешение в L2 происходит при связывании инструкции invokevirtual.
Помимо проверок описателей типов, возможности VarHandles для доступа к переменным не ограничены. Если VarHandle сформирован на непубличной переменной классом, у которого есть доступ к этой переменной, полученный VarHandle может быть использован в любом месте любым вызывающим объектом, который получает ссылку на него.
В отличие от API Core Reflection, где проверка доступа выполняется каждый раз при вызове рефлексивного метода, проверка доступа VarHandle выполняется при создании VarHandle. Таким образом, VarHandles к непубличным переменным или переменным в непубличных классах обычно следует держать в секрете. Их не следует передавать ненадежному коду, если их использование ненадежным кодом не будет безопасно.
Создание VarHandle
Код Java может создать VarHandle, который напрямую обращается к любому полю, доступному для этого кода. Это делается через рефлексивный, основанный на возможностях API, называемыйMethodHandles.Lookup. Например, VarHandle для нестатического поля можно получить из Lookup.findVarHandle. Также существует метод преобразования из объектов API Core Reflection, Lookup.unreflectVarHandle. Доступ к защищенным членам поля ограничен только получающими объектами класса, осуществляющего доступ, или одним из его подклассов, и сам доступный класс должен, в свою очередь, быть подклассом (или пакетом-близнецом) определяющего класса защищенного члена. Если VarHandle ссылается на защищенное нестатическое поле класса объявления вне текущего пакета, аргумент получателя будет сужен до типа класса доступа.
Взаимодействие между VarHandles и API Core Reflection
Используя методы-фабрики в APILookup, любое поле, представленное объектом API Core Reflection, может быть преобразовано в поведенчески эквивалентный VarHandle. Например, рефлексивный Field может быть преобразован в VarHandle с помощью Lookup.unreflectVarHandle. Полученные VarHandles, как правило, обеспечивают более прямой и эффективный доступ к основным полям. В качестве специального случая, когда API Core Reflection используется для просмотра методов доступа со свойством полиморфизма сигнатуры в этом классе, они отображаются как обычные неполиморфные методы. Их рефлексивный вид, как просматривается с помощью 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
VarHandle можно получить для переменной, такой как поле, которое объявлено с использованием дженериков Java. Как и в API Core Reflection, тип переменной VarHandle будет построен из стирания типа на уровне источника. Когда вызывается метод доступа VarHandle, типы его аргументов или тип возвращаемого значения могут быть дженериками или экземплярами типов. Если это произойдет, компилятор заменит эти типы их стираниями при построении символического описателя типа дляinvokevirtual инструкции.- Since:
- 9
- See Also:
Краткое описание вложенных классов
| Modifier and Type | Class | Описание |
|---|---|---|
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<Class<?>> |
coordinateTypes() |
Возвращает типы координат для этого VarHandle. |
Optional<VarHandle.VarHandleDesc> |
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 есть исполнение с точным поведением. |
final 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.
- 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 уже есть поведение вызова - точно, возвращается этот же VarHandle.
Вызов hasInvokeExactBehavior() на возвращаемом handle гарантированно вернёт true.
- API Note:
- Поведение вызова - точно гарантирует, что при вызове метода режима доступа типы и арность аргументов должны соответствовать
access mode type, в противном случае будет брошено исключениеWrongMethodTypeException. - Returns:
- VarHandle с поведением вызова - точно
- Since:
- 16
- See Also:
withInvokeBehavior
public abstract VarHandle withInvokeBehavior()
Если у этого VarHandle уже есть поведение вызова, возвращается этот же VarHandle.
Вызов hasInvokeExactBehavior() на возвращаемом handle гарантированно вернёт false.
- Returns:
- VarHandle с поведением вызова
- 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 final boolean isAccessModeSupported(VarHandle.AccessMode accessMode)
true , если заданный режим доступа поддерживается, в противном случае false. Возврат значения false для заданного режима доступа указывает на то, что при вызове соответствующего метода режима доступа будет выброшено UnsupportedOperationException.
- Параметры:
-
accessMode- режим доступа, соответствующий методу с тем же именем, полиморфному по сигнатуре - Возвращает:
-
true, если заданный режим доступа поддерживается, в противном случаеfalse.
toMethodHandle
public MethodHandle toMethodHandle(VarHandle.AccessMode accessMode)
- API Note:
- Этот метод для 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, если оно не может быть построено.- Specified by:
-
describeConstableв интерфейсеConstable - Возвращает:
Optionalсодержащий результирующее номинализированное описание, или пустойOptional, если оно не может быть построено.- Since:
- 12
fullFence
public static void fullFence()
- API Note:
- Игнорируя многие семантические различия с C и C++, этот метод имеет эффекты упорядочения памяти, совместимые с
atomic_thread_fence(memory_order_seq_cst)
acquireFence
public static void acquireFence()
- API Note:
- Игнорируя многие семантические различия с C и C++, этот метод имеет эффекты упорядочения памяти, совместимые с
atomic_thread_fence(memory_order_acquire)
releaseFence
public static void releaseFence()
- API Note:
- Игнорируя многие семантические различия с C и C++, этот метод имеет эффекты упорядочения памяти, совместимые с
atomic_thread_fence(memory_order_release)
loadLoadFence
public static void loadLoadFence()
storeStoreFence
public static void storeStoreFence()
© 1993, 2021, 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/17/docs/api/java.base/java/lang/invoke/VarHandle.html