2011-11-15 2 views
2

읽기 및 정수 (INT되지 않음) 다른 원자 쓰기는 다음과 같이하지 않으면원자 읽기 및 원자 쓰기를 보장하는 방법은 무엇입니까? 나는 원자 원하는

volatile Double a; // not double 
volatile Long b; // not long 
Integer c; // not int 
Boolean d; // not boolean 

, 어떻게 내가 그들을 원자 만들 것?

편집 : 명확한 설명을 위해 읽기와 쓰기를 결합한 원자 적 연산이 필요하지 않습니다. 나는 읽기가 원자 일 필요가 있고 쓰기는 원자 일 따름이어야합니다.

Edit2가 : @ 피터 Lawrey, @PeterLawrey,이 아이러니 : 여기 Double a; a = 0.5d;a이 기준이므로 기록 원자이다. 이 부분에있는 동안 double a; a = 0.5d; 글자는 원자적일 수 있습니다. 그리고 Doubledouble을 래핑합니다. 물론 나는 원자 적으로 읽고 쓰여지는 참조를 가진 임의의 객체의 래핑 된 내용에 같은 것을 적용하지 않을 것이다.

Edit3 : 원래 원자 읽기를 원했고 원 자성이 스레드간에 일관성을 유지한다고 생각하면서 작성했습니다. 나는 그렇지 못하며 여전히 변동성이 필요하다는 것을 발견했습니다.

답변

5

참조에 대한 모든 읽기 또는 쓰기는 원자 적입니다.

나는 당신이 읽고 쓰기를 원한다고 가정합니다. 이 경우에는 AtomicReference, AtomicLong, AtomicInteger 또는 AtomicBoolean을 적절하게 사용합니다. 성능이 중요한 경우 래퍼 대신 intlong 또는 double을 사용합니다.

스레드 간의 일관성을 위해 volatile이 필요합니다. 증분 및 스왑 같은 원자 연산의 경우 AtomicReference, AtomicReferenceFieldUpdater, AtomicLong, AtomicInteger, AtomicBoolean, AtomicIntegerArray, AtomicIntegerFieldUpdater 및 AtomicLongArray AtomicLongFieldUpdater 클래스를 사용할 수 있습니다. double에서 이러한 원자 적 연산을 수행하려면 Unsafe를 사용하여 자체 업데이터를 빌드 할 수 있지만 위험은 사용자가 감수해야합니다. ;)

+0

아니요 방금 원자 읽기를 의미했습니다. 그리고 원자 쓰기. 그들은 함께있을 필요가 없습니다. – H2ONaCl

+0

모든 참조 액세스는 원자 적입니다. 원자가 될 수 있다고 보장되지 않는 유일한 접근은'double' 또는'long'에 대한 비 휘발성 액세스입니다. –

+0

편집 2를 참조하십시오. – H2ONaCl