Java의 어떤 작업이 원 자성으로 간주됩니까?
답변:
그리고 어쩌면 더. jls를 보세요 .
주석에서 언급했듯이 원자 성은 가시성을 의미하지 않습니다. 따라서 다른 스레드는 부분적으로 작성된을 보지 않도록 보장되지만 int
새 값을 보지 못할 수 있습니다.
long 및 double에 대한 작업은 일반적인 64 비트 CPU 원자 적에서도 수행 되지만 보장은 없습니다. 이 기능 요청을 참조하십시오 .
64 bit jvm, long and double assignments are also atomic.
확실합니까? 나는 그것들이 컴파일 된 코드를위한 것이라고 말하고 싶지만, 해석 된 코드는 어떨까요? 아마 당신 말이 맞지만 보증이 있습니까?
Java에서는 32 비트 이하의 읽기 및 쓰기가 원자 적으로 보장됩니다.
원 자성이란 각 작업이 한 단계에서 발생하며 중단 될 수 없음을 의미합니다. 따라서 다중 스레드 응용 프로그램이있는 경우 읽기 및 쓰기 작업은 스레드로부터 안전하며 동기화 할 필요가 없습니다.
예를 들어 다음 코드는 스레드로부터 안전합니다.
public class ThreadSafe
{
private int x;
public void setX(int x)
{
this.x = x;
}
}
것 같다 갈망의 할당이 AtomicLong.java에서이 방법에 따라, 원자 것을 :
public final void set(long newValue) {
value = newValue;
}
동기화가 없습니다.
value
. 그것은이다 volatile
.
value
이다 volatile
의 할당하지 않습니다 value
원자, 그것은 단지 피할 수 "게시"문제.
volatile
걷고 및 복식은 원자 보장됩니다 java.sun.com/docs/books/jls/third_edition/html/memory.html#17.7