VarHandle — 변수나 변수 계열에 대한 강하게 타입된 참조

VarHandle — 변수나 변수 계열에 대한 강하게 타입된 참조

VarHandle은 변수, 또는 매개변수적으로 정의된 변수 계열에 대한 동적으로 강하게 타입된 참조예요. static 필드·non-static 필드·배열 요소·외부(off-heap) 데이터 구조의 컴포넌트를 포함해요. 이런 변수들에 대한 접근은 다양한 접근 모드(access modes)로 지원되는데, 평범한 읽기/쓰기, volatile 읽기/쓰기, compare-and-set 등을 포함해요.

출처: Java API Reference

본문

VarHandle이 가지는 것

VarHandle은 다음을 가져요.

  • 변수 타입 T — 이 VarHandle이 참조하는 모든 변수의 타입.
  • 좌표 타입 목록 CT1, CT2, ..., CTn — 이 VarHandle이 참조하는 변수를 함께 위치시키는 좌표 표현식의 타입들.

변수·좌표 타입은 원시 또는 참조일 수 있고 Class 객체로 표현돼요. 좌표 타입 목록은 비어 있을 수 있어요. VarHandle 인스턴스를 생산하거나 조회하는 팩토리 메서드는 지원되는 변수 타입과 좌표 타입 목록을 문서화해요.

각 접근 모드는 하나의 접근 모드 메서드(access mode method) 와 연결돼요. 이는 접근 모드 이름을 딴 시그니처 다형성(signature polymorphic) 메서드예요. 접근 모드 메서드가 VarHandle 인스턴스에서 호출되면, 호출의 초기 인자는 변수를 정확히 어느 객체에서 접근할지 나타내는 좌표 표현식들이에요. 호출의 뒤 인자들은 그 접근 모드에 중요한 값들을 나타내요. 예를 들어 다양한 compare-and-set/compare-and-exchange 접근 모드는 변수의 기대 값과 새 값에 대해 두 개의 뒤 인자가 필요해요.

접근 모드 메서드 호출의 인자 개수·타입은 정적으로 검사되지 않아요. 대신 각 접근 모드 메서드는 접근 모드 타입을 명시하는데, 이는 그 접근 모드의 호출 시그니처에 대한 런타임 검사를 정의해요.

접근 모드의 예

  • get·set — 평범한 읽기/쓰기.
  • getVolatile·setVolatile — volatile 의미론의 읽기/쓰기.
  • getOpaque·setOpaque — opaque 접근.
  • getAcquire·setRelease — 획득/해제 의미론.
  • compareAndSet·compareAndExchange·compareAndExchangeAcquire·compareAndExchangeRelease — CAS 계열.
  • getAndSet·getAndAdd·getAndIncrement·getAndDecrement — 원자적 갱신 계열.

주요 팩토리

  • MethodHandles.arrayElementVarHandle(Class<?>) — 배열 요소용 VarHandle.
  • MethodHandles.lookup().findStaticVarHandle(...)·findVarHandle(...) — 필드용 VarHandle.

VarHandle불변이고 눈에 보이는 상태가 없으며, 사용자가 상속할 수 없어요. Constable을 구현하는 abstract sealed class예요. 자바 9부터 제공돼요.

더 알아보기 (Learn more)