Java의 어떤 작업이 원 자성으로 간주됩니까?


답변:


100
  • long 및 double을 제외한 모든 기본 유형 할당
  • 모든 참조 할당
  • 휘발성 변수의 모든 할당
  • java.concurrent.Atomic * 클래스의 모든 작업

그리고 어쩌면 더. jls를 보세요 .

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

long 및 double에 대한 작업은 일반적인 64 비트 CPU 원자 적에서도 수행 되지만 보장은 없습니다. 이 기능 요청을 참조하십시오 .


21
에 할당 volatile걷고 및 복식은 원자 보장됩니다 java.sun.com/docs/books/jls/third_edition/html/memory.html#17.7
투입 Joonas Pulakka을

12
또한 작업은 원자 적이지만 특별한주의를 기울이지 않는 한 다중 스레드 응용 프로그램에서 해당 작업의 가시성이 보장되지 않을 수 있습니다 (여기의 세부 정보 는 주석에서 설명하기위한 방법입니다 .)
nos

5
64 bit jvm, long and double assignments are also atomic.확실합니까? 나는 그것들이 컴파일 된 코드를위한 것이라고 말하고 싶지만, 해석 된 코드는 어떨까요? 아마 당신 말이 맞지만 보증이 있습니까?
maaartinus 2011 년

4
사양은 64 비트 JVM이 긴 할당과 이중 할당에 원 자성을 제공하도록 요구하지 않습니다. java.sun.com/docs/books/jls/third_edition/html/memory.html#17.7 유명한 말로 "이 동작은 구현에 따라 다릅니다". 그러나 64 비트 VM은이를 원자 적 작업으로 구현할 가능성이 높습니다.
sjlee

1
IMHO, 일반 참조 할당은 원자 적이지만 AtomicReference는 더 많은 것을 제공합니다 : compareAndSet 및 getAndSet, 동기화 없이는 달성 할 수없는 것입니다.
maaartinus 2011 년

5

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

예를 들어 다음 코드는 스레드로부터 안전합니다.

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

5
..threadsafe는 값이 항상 원래 값 또는 설정 값과 정확히 일치한다는 의미입니다. "휘발성"또는 "동기화"가 없기 때문에 대부분의 최신 값은 다른 스레드에 표시되지 않습니다.
Mikko Wilkman

1
@MikkoWilkman의 말에 +1. 이 코드는 메모리 가시성 관점에서 스레드로부터 안전하지 않기 때문에 사용해서는 안됩니다.
바늘 두더지 주먹

0

같다 갈망의 할당이 AtomicLong.java에서이 방법에 따라, 원자 것을 :

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

동기화가 없습니다.


3
의 선언을보십시오 value. 그것은이다 volatile.
maaartinus

2
그것은 value이다 volatile의 할당하지 않습니다 value원자, 그것은 단지 피할 수 "게시"문제.
Lyle Z

7
둘 다 수행합니다. JLS, 섹션 17.7 참조 : 휘발성 long 및 double 값의 쓰기 및 읽기는 항상 원자 적입니다.
maaartinus 2013

@LyleZ는 내 의견으로는이 스레드에서 가장 가치있는 댓글입니다.
stdout
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.