Java 휘발성 참조 대 AtomicReference
volatile
Object 참조와 AtomicReference
방금 사용하는 경우 get()
와 set()
-methods from 사이에 차이점이 AtomicReference
있습니까?
짧은 대답은 : 아니요.
로부터 java.util.concurrent.atomic의 패키지 문서 :
원자의 접근 및 업데이트에 대한 메모리 효과는 일반적으로 휘발성 물질에 대한 규칙을 따릅니다.
get
volatile
변수 를 읽는 메모리 효과가 있습니다.set
volatile
변수 쓰기 (할당)의 메모리 효과가 있습니다.
그건 그렇고, 패키지의 문서는 매우 훌륭하며 모든 것이 설명되어 있습니다 ...
lazySet
(Java 6에 도입)은 volatile
변수를 통해 달성 할 수없는 의미를 갖는 새로운 작업입니다 . 자세한 내용은 이 게시물 을 참조하십시오.
아니 없어.
AtomicReference가 제공하는 추가 기능은 compareAndSet () 메서드와 친구입니다. 이러한 메소드가 필요하지 않은 경우, 휘발성 참조는 AtomicReference.set () 및 .get ()과 동일한 의미를 제공합니다.
몇 가지 차이점과 장단점이 있습니다.
AtomicReference
get / set을 사용하면 (javadoc 상태와 같이) 휘발성 필드 와 동일한 JMM 시맨틱이 있지만AtomicReference
참조 주위의 래퍼이므로 필드에 액세스하려면 추가 포인터 추적이 필요 합니다.메모리 공간이 승산된다 (대부분의 VM에서 참 압축 죄송 환경을 가정)
- 휘발성 기준 = 4b
AtomicReference
= 4b + 16b (12b 객체 헤더 + 4b 참조 필드)
AtomicReference
휘발성 참조보다 풍부한 API를 제공합니다. 을 사용AtomicFieldUpdater
하거나 Java 9 a 를 사용하여 휘발성 참조에 대한 API를 다시 얻을 수 있습니다VarHandle
.sun.misc.Unsafe
가위로 달리기를 좋아한다면 직진 할 수도 있습니다 .AtomicReference
자체는를 사용하여 구현됩니다Unsafe
.
따라서 언제 다른 것을 선택하는 것이 좋습니까?
- get / set 만 필요하십니까? 휘발성 필드, 가장 간단한 솔루션 및 가장 낮은 오버 헤드를 고수하십시오.
- 추가 기능이 필요하십니까? 이것이 코드의 성능 (속도 / 메모리 오버 헤드)에 민감한 부분 이라면 가독성을 높이고 성능 향상 위험을 감수하는
AtomicReference
/AtomicFieldUpdater
/ 중에서 선택Unsafe
하십시오. 민감한 지역이 아니라면 가십시오AtomicReference
. 라이브러리 작성자는 일반적으로 대상 JDK, 예상 API 제한, 메모리 제한 등에 따라 이러한 방법을 혼합하여 사용합니다.
JDK 소스 코드 는 이와 같은 혼란에 대답하는 가장 좋은 방법 중 하나입니다. AtomicReference의 코드를 보면 객체 저장에 volatie 변수를 사용합니다.
private volatile V value;
따라서 AtomicReference에서 get () 및 set ()을 사용하려는 경우 휘발성 변수를 사용하는 것과 같습니다. 그러나 다른 독자들이 언급했듯이 AtomicReference는 추가적인 CAS 의미를 제공합니다. 따라서 먼저 CAS 의미론을 원하는지 여부를 결정하고 AtomicReference 만 사용하십시오.
AtomicReference는 일반 휘발성 변수가 제공하지 않는 추가 기능을 제공합니다. API를 읽었을 때 이것을 알고 있지만 일부 작업에 유용한 잠금을 제공합니다.
그러나이 추가 기능이 필요하지 않으면 일반 휘발성 필드를 사용하는 것이 좋습니다.
참고 URL : https://stackoverflow.com/questions/281132/java-volatile-reference-vs-atomicreference
'programing tip' 카테고리의 다른 글
데이터 매퍼, 테이블 데이터 게이트웨이 (게이트웨이), 데이터 액세스 개체 (DAO) 및 리포지토리 패턴의 차이점은 무엇입니까? (0) | 2020.07.01 |
---|---|
Git : Repository, fork, branch, clone, track에서이 단어의 의미는 무엇입니까? (0) | 2020.07.01 |
왜 메이븐? (0) | 2020.07.01 |
pip 요구 사항 파일에 주석을 추가 할 수 있습니까? (0) | 2020.07.01 |
람다의 매개 변수 유형과 반환 유형을 알아낼 수 있습니까? (0) | 2020.07.01 |