VolatileCallSite — 타깃이 volatile 변수처럼 동작하는 콜 사이트
VolatileCallSite — 타깃이 volatile 변수처럼 동작하는 콜 사이트
VolatileCallSite는 타깃이 volatile 변수처럼 동작하는 CallSite예요. VolatileCallSite에 연결된 invokedynamic 명령어는 다른 스레드에서 변경이 일어나더라도 콜 사이트 타깃에 대한 갱신을 즉시 보게 돼요. 이런 스레드 간 밀착 결합에는 성능 비용이 따를 수 있어요.
본문
MutableCallSite와 달리 volatile 콜 사이트에는 syncAll 연산이 없어요. volatile 변수에 대한 모든 쓰기는 읽는 스레드와 암묵적으로 동기화되기 때문이에요. 그 외의 측면에서는 VolatileCallSite가 MutableCallSite와 상호 교환 가능해요.
상속 구조는 다음과 같아요.
java.lang.Object
java.lang.invoke.CallSite
java.lang.invoke.VolatileCallSite
생성자
VolatileCallSite(MethodType type)— 타깃에 대한 volatile 바인딩으로 콜 사이트를 만들어요. 초기 타깃은 주어진 타입의 메서드 핸들인데, 호출되면IllegalStateException을 던지는 메서드 핸들로 설정돼요.type이 null이면NullPointerException을 던져요.VolatileCallSite(MethodHandle target)— 타깃에 대한 volatile 바인딩으로 콜 사이트를 만들어요. 타깃은 주어진 값으로 설정돼요.target이 null이면NullPointerException을 던져요.
메서드
final MethodHandle dynamicInvoker()— 이 콜 사이트에 연결된invokedynamic명령어와 동등한 메서드 핸들을 만들어요.final MethodHandle getTarget()— 콜 사이트의 타깃 메서드를 반환해요.VolatileCallSite의 volatile 필드처럼 동작해요.void setTarget(MethodHandle newTarget)— 이 콜 사이트의 타깃 메서드를 volatile 변수로서 갱신해요.
타깃 갱신이 다른 스레드에 곧바로 보여야 하는 경우가 아니라면, 성능상 MutableCallSite를 쓰는 게 나을 수 있어요.