mailing list에서 휘발성 바스의 작업에 데이터 레이스가 포함되어 있다면 ("모든 순차적 일관성있는 실행에 데이터 레이스가없는 경우에만 프로그램이 올바르게 동기화됩니다."라는 메시지가 JLS에 있음) 적용 할 수 없습니다. .왜 우리는 JLS에 포함 된 보증을 적용 할 수 없습니까?
편의를 위해, 난 그냥 여기에 orginal content의 일부를 넣어 :
I 휘발성 변수를 사용하는 프로그램과 내가는 "A 프로그램이 제대로 경우에만 경우 동기화 사용에 대한 추론하기 위하여 노력하고 있습니다 모든 순차적 일관성있는 실행에는 데이터 레이스가 없습니다. " JLS3의 보증.
JLS3에는 내 프로그램에 데이터 경주가 없음을 증명하지 못하게하는 결함이있는 것으로 보입니다. 특히 휘발성 변수 V의 읽기 R과 동기화 순서에서 R 다음에 오는 V의 쓰기 W를 고려하십시오. JLS3은 R과 W를 충돌하는 액세스로 간주합니다. 또한, R에서 W까지 우연히 발생하는 에지가 없습니다. 따라서 JLS3는 R과 W를 데이터 경쟁으로 간주합니다. 결국, 위에서 언급 한 보증을 적용 할 수없는 것으로 보입니다.
그래서 이것이 나의 질문입니다. 왜 휘발성 물질에 대한 조치가 데이터 경합을 포함한다면 JLS에 포함 된 보증을 적용 할 수없는 이유는 무엇입니까?
그것은 보증이 아니며, 정의이며, 명시 적으로 조건을 제외합니다. 진짜 질문이 아닙니다. – EJP
답변은 [이 메시지에 있습니다] (http://www.cs.umd.edu/~pugh/java/memoryModel/archive/2482.html) => 데이터 경쟁의 정의에 버그가 있습니다. 이것을 허락한다. 그러나 그렇게해서는 안된다. (즉, 휘발성 변수를 사용하면 데이터 경합을 막아야한다. 그러나 현재 JMM 문구에서는 항상 그런 것은 아니다.) – assylias
@assylias 혼란스럽게도,이 사실은 이미 OP에 잘 알려져 있습니다. –