VolatileCallSite — 타깃이 volatile 변수처럼 동작하는 콜 사이트

VolatileCallSite — 타깃이 volatile 변수처럼 동작하는 콜 사이트

VolatileCallSite는 타깃이 volatile 변수처럼 동작하는 CallSite예요. VolatileCallSite에 연결된 invokedynamic 명령어는 다른 스레드에서 변경이 일어나더라도 콜 사이트 타깃에 대한 갱신을 즉시 보게 돼요. 이런 스레드 간 밀착 결합에는 성능 비용이 따를 수 있어요.

출처: Java API Reference

본문

MutableCallSite와 달리 volatile 콜 사이트에는 syncAll 연산이 없어요. volatile 변수에 대한 모든 쓰기는 읽는 스레드와 암묵적으로 동기화되기 때문이에요. 그 외의 측면에서는 VolatileCallSiteMutableCallSite와 상호 교환 가능해요.

상속 구조는 다음과 같아요.

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를 쓰는 게 나을 수 있어요.

더 알아보기 (Learn more)