Класс ChainedCallSite
java.lang.Object
java.lang.invoke.CallSite
java.lang.invoke.MutableCallSite
jdk.dynalink.support.AbstractRelinkableCallSite
jdk.dynalink.support.ChainedCallSite
- Все реализованные интерфейсы:
RelinkableCallSite
public class ChainedCallSite extends AbstractRelinkableCallSite
Перепривязываемая точка вызова, реализующая стратегию полиморфного встроенного кэширования. Она запоминает до 8
GuardedInvocation, с которыми была связана, и при каждом запросе на перепривязку строит каскадную цепочку дескрипторов методов, в которой один вызов при неудаче передаёт управление следующему. Количество запоминаемых вызовов можно настроить, переопределив getMaxChainLength() в подклассе. Если эта точка вызова перепривязывается с новым вызовом, а длина цепочки уже достигла максимума, самый старый вызов удаляется. Вызовы с недействительными точками переключения, а также вызовы, для которых было сгенерировано исключение при аннулировании, немедленно удаляются из цепочки. Вызовы никогда не меняются местами: дескриптор метода, связанный последним, всегда находится в начале цепочки, а связанный первым — в её конце. Точку вызова можно безопасно перепривязывать одновременно из нескольких потоков. Состояния гонки при связывании разрешаются удалением GuardedInvocation, созданного проигравшим потоком, без включения его в цепочку, поэтому для одних и тех же аргументов связывание может повторяться.- С версии:
- 9
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
ChainedCallSite |
Создаёт новую цепочечную точку вызова. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
protected int |
getMaxChainLength() |
Максимальное количество дескрипторов методов в цепочке. |
void |
relink |
Этот метод будет вызываться динамическим компоновщиком каждый раз при перепривязке точки вызова (исключение см. в описании RelinkableCallSite.resetAndRelink(GuardedInvocation, MethodHandle)). |
void |
resetAndRelink |
Этот метод будет вызываться динамическим компоновщиком каждый раз при перепривязке точки вызова, и если компоновщик хочет, чтобы точка вызова отбросила предыдущее состояние связывания (именно этим он отличается от RelinkableCallSite.relink(GuardedInvocation, MethodHandle)). |
Методы, объявленные в классе AbstractRelinkableCallSite
getDescriptor, initialize
Методы, объявленные в классе MutableCallSite
dynamicInvoker, getTarget, setTarget, syncAll
Подробное описание конструкторов
ChainedCallSite
public ChainedCallSite(CallSiteDescriptor descriptor)
Создаёт новую цепочечную точку вызова.
- Параметры:
-
descriptor— дескриптор точки вызова.
Подробное описание методов
getMaxChainLength
protected int getMaxChainLength()
Максимальное количество дескрипторов методов в цепочке. По умолчанию равно 8. Если требуется изменить это значение, можно переопределить метод в подклассе.
- Возвращает:
- максимальное количество дескрипторов методов в цепочке. Возвращаемое значение проверяется; если переопределённый метод возвращает значение меньше 1, будет выброшено исключение
RuntimeException.
relink
public void relink(GuardedInvocation guardedInvocation, MethodHandle relinkAndInvoke)
Описание скопировано из интерфейса:
RelinkableCallSiteЭтот метод будет вызываться динамическим компоновщиком каждый раз при перепривязке точки вызова (исключение см. в описании
RelinkableCallSite.resetAndRelink(GuardedInvocation, MethodHandle)). Ему будет передан GuardedInvocation, который точка вызова должна включить в целевой дескриптор метода. При вызове этого метода точка вызова может сохранять другие неаннулированные вызовы для реализации полиморфных встроенных кэшей и объединять их с этим вызовом, формируя итоговую цель.- Параметры:
-
guardedInvocation— защищённый вызов, который точка вызова должна включить в целевой дескриптор метода. -
relinkAndInvoke— дескриптор метода для перепривязки и вызова. Это дескриптор метода, соответствующий типу метода точки вызова, который предоставляется в качестве обратного вызова объектомDynamicLinker. Точка вызова должна использовать его как окончательный резервный вариант, если не может вызвать свою цель с переданными аргументами. При вызове этот резервный метод попытается получить подходящий целевойGuardedInvocationдля вызова, затем вызоветRelinkableCallSite.relink(GuardedInvocation, MethodHandle)илиRelinkableCallSite.resetAndRelink(GuardedInvocation, MethodHandle), а затем вызовет цель.
resetAndRelink
public void resetAndRelink(GuardedInvocation guardedInvocation, MethodHandle relinkAndInvoke)
Описание скопировано из интерфейса:
RelinkableCallSiteЭтот метод будет вызываться динамическим компоновщиком каждый раз при перепривязке точки вызова, и если компоновщик хочет, чтобы точка вызова отбросила предыдущее состояние связывания (именно этим он отличается от
RelinkableCallSite.relink(GuardedInvocation, MethodHandle)). Ему будет передан GuardedInvocation, который точка вызова должна использовать для создания нового целевого дескриптора метода. При вызове этого метода точке вызова не рекомендуется сохранять предыдущее состояние; предполагается, что она будет связывать только текущий вызов.- Параметры:
-
guardedInvocation— защищённый вызов, который точка вызова должна использовать для создания целевого дескриптора метода. -
relinkAndInvoke— дескриптор метода для перепривязки и вызова. Это дескриптор метода, соответствующий типу метода точки вызова, который предоставляется в качестве обратного вызова объектомDynamicLinker. Точка вызова должна использовать его как окончательный резервный вариант, если не может вызвать свою цель с переданными аргументами. При вызове этот резервный метод попытается получить подходящий целевойGuardedInvocationдля вызова, затем вызоветRelinkableCallSite.relink(GuardedInvocation, MethodHandle)илиRelinkableCallSite.resetAndRelink(GuardedInvocation, MethodHandle), а затем вызовет цель.
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/25/docs/api/jdk.dynalink/jdk/dynalink/support/ChainedCallSite.html