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