다른 모든 원자 물체는 동일합니까? AtomicInteger에 대한 질문을 설명하는 것이 더 쉽습니다. 1 개 이상의 thread가 myInt 에의 참조에 액세스하고 있기 (위해) 때문에, volatile로서 선언되어 있지 않은 한,이 객체에 대해서, 1 개의 thread가 등록 된 캐쉬 된 값, 예를 들어 null을 참조 할 수있을 가능성이 없는가? 어떻게 오지 않는거야?AtomicReference를 휘발성으로 선언해야합니까?
답변
실제로 필요하지 않을뿐만 아니라 실제로 의미 상 잘못되었습니다. AtomicReference
은 "실제"참조 자체를 보유하고 자체 동기화 구성을 사용하여 액세스를 관리합니다. JVM 자체의 동기화 구성 (synchronized
, volatile
등)은 사용되지 않습니다. AtomicReference
개체 자체는 휘발성으로 처리하면 안됩니다. 문제가 있다면 final
으로 만드십시오.
this question - volatile
은 모두 받기 및 설정 작업이 필요한 경우 AtomicReference
을 사용하는 대신 사용할 수있는 것으로 간주 할 수 있습니다.
왜 안 되니? 동시 맵은 합법적 인 이유 때문에 휘발성 필드에서 보류 될 수 있으며 "원자"오브젝트에 대해 이것이 사실이 아니어야하는 이유를 알지 못합니다. –
@ 엔노 : 물론, 그 시나리오가 적절한 시나리오를 만들 수 있다고 생각합니다. 코드에서 '가변적 인 AtomicReference'를 보았다면 저자가 의도 한 바가 아닐 것입니다. – skaffman
@skaffman : 물론 AtomicReferance는 자체 내부의 대상 객체에 대한 실제 참조를 보유하지만이 AtomicReference 객체에 대한 참조를 참조합니다. 그러나 실제로 나는 그것을 최종적으로 만들 수 있으며 완벽한 감각을 갖습니다. 감사! –
"원자"개체는 변경할 수 없으므로 제대로 게시 된 경우에만 스레드로부터 안전해야합니다. 예를 들어, 이와 같이하면 휘발성 키워드를 사용해야합니다.
volatile AtomicInteger counter = // initialize counter
int harvest(){
AtomicInteger old = counter;
counter = new AtomicInteger();
return old.get();
}
위의 코드에서 휘발성 코드를 제거하면 실제로 몇 가지 증분을 잃을 수 있습니다. 스펙에 따르면, 완전하게 구성되지 않은 AtomicInteger 오브젝트에 대한 참조를 얻을 수 있으므로 정의되지 않은 동작이 발생합니다.
따라서 원자 객체를 휘발성으로 선언해야합니까? 답은 달려있다. 다른 스레드 안전 객체와 마찬가지로 올바르게 게시 된 경우에만 스레드로부터 안전합니다 (특수 객체 인 불변 객체 제외). 대부분의 경우, 최종적으로 만들어야합니다.
- 1. WaitHandle (s)을 휘발성으로 선언해야합니까?
- 2. 파이프 라인을 어떻게 선언해야합니까?
- 3. C에서 함수를 선언해야합니까?
- 4. web.config에서 https를 선언해야합니까?
- 5. 자바 서블릿에서 여러 스레드가 액세스하는 변수를 volatile로 선언해야합니까?
- 6. 렌더 타겟 결과를 비 휘발성으로 유지하려면 어떻게해야합니까?
- 7. PHP 클래스에서 언제 변수를 선언해야합니까?
- 8. for 루프 안에 반복자를 선언해야합니까?
- 9. 자바에서 모든 객체 생성을 선언해야합니까?
- 10. 템플릿에 사용되는 함수는 언제 선언해야합니까?
- 11. 원자 적으로 교환 할 수있는 AtomicReference를 생성 할 수 있습니까?
- 12. 정적으로 주입 된 값을 휘발성으로 만들 필요가 있습니까?
- 13. C#에서 지역 변수를 휘발성으로 사용할 수없는 이유는 무엇입니까?
- 14. 웹 페이지에서 전역 JavaScript 변수는 어디에서 선언해야합니까?
- 15. 멤버 변수를 사용하거나 함수 내에서 변수를 선언해야합니까?
- 16. C89 : 함수를 참조하기 전에 함수를 선언해야합니까?
- 17. Objective-C 및 NSURL : receivedData를 어디에 선언해야합니까?
- 18. 모든 함수를 기본 클래스에 가상으로 선언해야합니까?
- 19. 왜 jsp의 EL 기능을 정적으로 선언해야합니까?
- 20. 코드 이그니 터에서 전역 변수는 어디에 선언해야합니까?
- 21. Public 메서드에서 [DataMember (Order = n)] 특성을 선언해야합니까?
- 22. 이것을 클래스의 const int 멤버 변수로 선언해야합니까?
- 23. 클래스에 특정한 새 삭제 연산자를 정적으로 선언해야합니까?
- 24. Objective C에서 인스턴스를 인스턴스 변수로 선언해야합니까?
- 25. 왜 일반 서브 클래스에서 형식 제약 조건을 다시 선언해야합니까?
- 26. Java에서 가장 깊게 중첩 된 루프의 카운터를 어디에 선언해야합니까?
- 27. 형식화 된 데이터 집합에서 일반 GetDataRow 메서드는 어디에서 선언해야합니까?
- 28. 모듈 수준에서 클래스 별 "상수"를 여전히 선언해야합니까?
- 29. Java에서 읽기 전용 인 경우 내 컬렉션을 동기화로 선언해야합니까?
- 30. 클래스가 private 패키지로 선언 될 때 공용 생성자를 선언해야합니까?
나는 모든 AtomicReference 필드를 final로 만듭니다. 절대 변경하지 않아야합니다. –