자바 사양 보장 (, 반대로. long
더블 types
에 대한관계는 원시 변수 할당은 항상 원자이다
을 기대 유명한 i++
증가 조작에 대응 Fetch-and-Add 작업은 비 원자 것 이 코드를 가정 읽기 - 수정 - 쓰기 작업으로 이어지는 때문에
:.
public void assign(int b) {
int a = b;
}
생성 바이트 코드는 다음
public void assign(int);
Code:
0: iload_1
1: istore_2
2: return
따라서, 우리는 할당 두 단계 (로드 및 저장) 구성된다 참조. 말했듯이, X86 프로세서 수 (현대 것들 적어도), 원자 적으로 증가 동작을 동작하는 것을 알고
public void assign(int);
Code:
0: iload_1
1: iinc 1, 1 //extra step here regarding the previous sample
4: istore_2
5: return
:
public void assign(int b) {
int i = b++;
}
바이트 코드 :
이 코드를 가정
컴퓨터 과학에서 fetch-and-add CPU 명령은 원자 적으로 수정하는 특수한 명령입니다 메모리의 내용은 위치입니다. 이것은 상호 배제를 구현하고 다중 프로세서 시스템에서 동시적인 세마포어 알고리즘을 구현하는 데 사용됩니다. 따라서
, 첫 번째 질문 : 바이트 코드는 두 단계 (로드 및 저장)를 필요로한다는 사실에도 불구하고, 자바는 할당 작업이 항상 원자 어떤 프로세서의 아키텍처 때문에 수행 작업이라는 사실에 의존 않습니다 그것의 명세에서 영구적 인 원 자성 (primitive assignment)을 보장 할 수 있는가?
두 번째 질문 :는 i++
작업 (또는 AtomicInteger
)를 동기화 전혀 필요가 없습니다, 매우 현대적인 X86 프로세서 및 다른 아키텍처를 통해 컴파일 된 코드를 공유하지 않고 사항을 확인하는 것은 잘못인가? 그것은 이미 원자 적이라고 생각합니다.
내 이해는 할당의 원 자성은 istore가 원자 적이라는 것을 의미합니다. 즉, 'a = b'에서는'b '가 읽힌 다음 새로운 값으로 변할 가능성이 있습니다. 'a'에 할당됩니다. 그러나 원자 성은 'a'가 'b'가 보유한 두 개의 값을 섞어서는 안된다는 것을 보장합니다. – assylias
@assylias 그게 내가 생각하기에, 나는이 관점에 동의한다. – Mik378