나는 AtomicInteger의 유즈 케이스를 잘 알고 있지만 AtomicBoolean이 어떻게 두 개의 액션의 원 자성을 보장 할 수 있는지 혼란 스럽다. '부울 값 변경'및 ii. AtomicBoolean 변수에 대해 자주 인용 사용 사례를 다음에서 '한 번 로직'예 : (초기화)을 실행은 atomicInitialized :AtomicBoolean은 실제로 원 자성을 성취합니까?
if (atomicInitialized.compareAndSet(false, true)) {
initialize();
}
먼저 true로 atomicInitialized를 설정 (이 경우는 false)과 의지이 작업 안전하지 않은 intialize()를 실행하십시오. initialize()는 한 번만 호출되지만 getAndSet()을 두 번째로 호출하는 스레드는 첫 번째 스레드가 초기화를 완료 할 때까지 지연되지 않습니다. 따라서, AtomicBoolean은 부울 값을 업데이트 할 때 원 자성을 제공하지만 실제로 'if-block'전체에 대해 원 자성을 제공하지는 않으며 전체 원 자성을 달성하기 위해 동기화/잠금 메커니즘을 사용해야합니다. 따라서 자주 인용되거나 대중적인 유스 케이스가 아닌 것은 원자 적입니다!
http://stackoverflow.com/questions/4501223/when-i-need-to-use-atomicboolean-in-java – JNL
AtomicBoolean은 원자 적이지만 차단하지 않습니다. 이전에 그 예를 보지 못했지만 그래, 깨졌습니다. – kiheru
예. 그 안에 포함 된 부울 값의 값을 처리하는 데는 원 자성 만 제공됩니다 ... "마술처럼"10 선 근처의 모든 것을 원자도 만들 수있는 것은 아닙니다 ... – ppeterka