2011-01-21 2 views

답변

80
  • 참조 긴 더블
  • 모든 과제 휘발성 변수의
  • 모든 과제 java.concurrent.Atomic의
  • 모든 작업 * 클래스

을 제외하고 기본 유형의 모든 과제 어쩌면 더 많은 것이있을 것입니다. jls을보십시오.

주석에서 언급했듯이 원 자성은 가시성을 의미하지 않습니다. 따라서 다른 스레드가 부분적으로 작성된 int을 볼 수 없도록 보장되지만 새 값을 결코 볼 수 없습니다.

long과 double에 대한 연산은 일반적인 64 비트 CPU atomic as well에 있지만 보장 할 수는 없습니다. 이 내용은 feature request을 참조하십시오.

+18

'volatile'longs와 double에 대한 할당은 원자 적이어야합니다. http://java.sun.com/docs/books/jls/third_edition/html/memory.html#17.7 –

+10

또한, 작업은 원자 단위이므로 특별히 신경 쓰지 않는 한 다중 스레드 응용 프로그램에서 해당 작업의 가시성이 보장되지 않을 수 있습니다 (자세한 내용은 여기 * 설명에 설명이 복잡합니다). – nos

+0

64 비트 jvm, long 및 double assigments 또한 원자입니다. –

4

Java에서 32 비트 이하의 읽기 및 쓰기는 원자 적이어야합니다.
원자 단위로, 각 동작은 한 단계에서 발생하며 중단 될 수 없음을 의미합니다. 따라서 다중 스레드 응용 프로그램이있는 경우 읽기 및 쓰기 작업은 스레드로부터 안전하므로 동기화 할 필요가 없습니다.

public final void set(long newValue) { 
    value = newValue; 
} 

참고 :이 가 AtomicLong.java에서이 방법에 따라, 갈망의 과제는 원자이다을 보일 수있을 것입니다

public class ThreadSafe 
    { 
    private int x; 
    public void setX(int x) 
      { 
      this.x = x; 
      } 
    } 
+5

.. 그 값은 언제나 원래의 값이나 설정 값이 될 것입니다. 대부분의 최신 값은 여전히 ​​"휘발성"또는 "동기화 됨"이 없어 다른 스레드에서 볼 수 없습니다. –

+1

+1에 @MikkoWilkman이 말합니다. 이 코드는 메모리 가시성 측면에서 스레드로부터 안전하지 않기 때문에 사용하면 안됩니다. –

0

: 예를 들어

, 다음 코드는 스레드 안전 동기화가 없다.

+3

'value'의 선언을보세요. 그것은 '휘발성'이다. – maaartinus

+1

'value'는'volatile'이고'value'는 원자 적으로 지정되지 않습니다. 단순히 "발행"문제를 피할뿐입니다. –

+6

둘 다 수행합니다 ([JLS, 섹션 17.7] 참조) (http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7) : volatile long의 쓰기 및 읽기 double 값은 항상 원자 적입니다. – maaartinus

관련 문제