2011-08-12 5 views
5

다른 모든 원자 물체는 동일합니까? AtomicInteger에 대한 질문을 설명하는 것이 더 쉽습니다. 1 개 이상의 thread가 myInt 에의 참조에 액세스하고 있기 (위해) 때문에, volatile로서 선언되어 있지 않은 한,이 객체에 대해서, 1 개의 thread가 등록 된 캐쉬 된 값, 예를 들어 null을 참조 할 수있을 가능성이 없는가? 어떻게 오지 않는거야?AtomicReference를 휘발성으로 선언해야합니까?

+0

나는 모든 AtomicReference 필드를 final로 만듭니다. 절대 변경하지 않아야합니다. –

답변

8

실제로 필요하지 않을뿐만 아니라 실제로 의미 상 잘못되었습니다. AtomicReference은 "실제"참조 자체를 보유하고 자체 동기화 구성을 사용하여 액세스를 관리합니다. JVM 자체의 동기화 구성 (synchronized, volatile 등)은 사용되지 않습니다. AtomicReference 개체 자체는 휘발성으로 처리하면 안됩니다. 문제가 있다면 final으로 만드십시오.

this question - volatile은 모두 받기 및 설정 작업이 필요한 경우 AtomicReference을 사용하는 대신 사용할 수있는 것으로 간주 할 수 있습니다.

+0

왜 안 되니? 동시 맵은 합법적 인 이유 때문에 휘발성 필드에서 보류 될 수 있으며 "원자"오브젝트에 대해 이것이 사실이 아니어야하는 이유를 알지 못합니다. –

+0

@ 엔노 : 물론, 그 시나리오가 적절한 시나리오를 만들 수 있다고 생각합니다. 코드에서 '가변적 인 AtomicReference'를 보았다면 저자가 의도 한 바가 아닐 것입니다. – skaffman

+0

@skaffman : 물론 AtomicReferance는 자체 내부의 대상 객체에 대한 실제 참조를 보유하지만이 AtomicReference 객체에 대한 참조를 참조합니다. 그러나 실제로 나는 그것을 최종적으로 만들 수 있으며 완벽한 감각을 갖습니다. 감사! –

1

"원자"개체는 변경할 수 없으므로 제대로 게시 된 경우에만 스레드로부터 안전해야합니다. 예를 들어, 이와 같이하면 휘발성 키워드를 사용해야합니다.

volatile AtomicInteger counter = // initialize counter 

int harvest(){ 
    AtomicInteger old = counter; 
    counter = new AtomicInteger(); 
    return old.get(); 
} 

위의 코드에서 휘발성 코드를 제거하면 실제로 몇 가지 증분을 잃을 수 있습니다. 스펙에 따르면, 완전하게 구성되지 않은 AtomicInteger 오브젝트에 대한 참조를 얻을 수 있으므로 정의되지 않은 동작이 발생합니다.

따라서 원자 객체를 휘발성으로 선언해야합니까? 답은 달려있다. 다른 스레드 안전 객체와 마찬가지로 올바르게 게시 된 경우에만 스레드로부터 안전합니다 (특수 객체 인 불변 객체 제외). 대부분의 경우, 최종적으로 만들어야합니다.

관련 문제