의는 다음과 같은 문장을 보자 :Java 컴파일러 또는 JVM이 독립적 인 명령어의 명령어 순서를 바꿀 수 있습니까?
이제int d0, d1;
int[] ds = {0, 0};
하나 개의 스레드가 다음 지침 :
d0++;
d1++;
다른 스레드가이 명령을 가지고있는 동안 :
ds[1] = d1;
ds[0] = d0;
우리는 병렬로 이러한 스레드를 실행하는 경우 ds
이 {0, 0}, {1, 1} 및 {1, 0}처럼 보일 수있는 세 가지 조합이 분명히 있습니다.
큰 질문은 다음과 같습니다. {0, 1}도있을 수 있습니까? 컴파일러/JVM은 관련이 없다고 생각하기 때문에 명령어를 간단히 바꿀 수 있습니까? 그렇다면, 그러한 행위에 대한 "규칙"은 정확히 무엇이며 컴파일러 또는 JVM에 달려 있습니까?
일반적으로 직렬 (iow, 한 스레드) 모델에서 최적화되지 않은 코드와 동일한 동작을하는 경우 최적화가 안전하다고 간주됩니다. 관련 언어 구문에 스레딩에 대한 명시적인 조항이없는 경우 –