2012-08-24 2 views
1

mailing list에서 휘발성 바스의 작업에 데이터 레이스가 포함되어 있다면 ("모든 순차적 일관성있는 실행에 데이터 레이스가없는 경우에만 프로그램이 올바르게 동기화됩니다."라는 메시지가 JLS에 있음) 적용 할 수 없습니다. .왜 우리는 JLS에 포함 된 보증을 적용 할 수 없습니까?

편의를 위해, 난 그냥 여기에 orginal content의 일부를 넣어 :

I 휘발성 변수를 사용하는 프로그램과 내가는 "A 프로그램이 제대로 경우에만 경우 동기화 사용에 대한 추론하기 위하여 노력하고 있습니다 모든 순차적 일관성있는 실행에는 데이터 레이스가 없습니다. " JLS3의 보증.

JLS3에는 내 프로그램에 데이터 경주가 없음을 증명하지 못하게하는 결함이있는 것으로 보입니다. 특히 휘발성 변수 V의 읽기 R과 동기화 순서에서 R 다음에 오는 V의 쓰기 W를 고려하십시오. JLS3은 R과 W를 충돌하는 액세스로 간주합니다. 또한, R에서 W까지 우연히 발생하는 에지가 없습니다. 따라서 JLS3는 R과 W를 데이터 경쟁으로 간주합니다. 결국, 위에서 언급 한 보증을 적용 할 수없는 것으로 보입니다.

그래서 이것이 나의 질문입니다. 왜 휘발성 물질에 대한 조치가 데이터 경합을 포함한다면 JLS에 포함 된 보증을 적용 할 수없는 이유는 무엇입니까?

+0

그것은 보증이 아니며, 정의이며, 명시 적으로 조건을 제외합니다. 진짜 질문이 아닙니다. – EJP

+1

답변은 [이 메시지에 있습니다] (http://www.cs.umd.edu/~pugh/java/memoryModel/archive/2482.html) => 데이터 경쟁의 정의에 버그가 있습니다. 이것을 허락한다. 그러나 그렇게해서는 안된다. (즉, 휘발성 변수를 사용하면 데이터 경합을 막아야한다. 그러나 현재 JMM 문구에서는 항상 그런 것은 아니다.) – assylias

+0

@assylias 혼란스럽게도,이 사실은 이미 OP에 잘 알려져 있습니다. –

답변

2

순차적 일관성 실행 "휘발성

=>

실행으로 기록 선행 휘발성의 판독을

=>

프로그램이 아닌 데이터 레이스를 포함 포함 올바르게 동기화 됨 "

=>

JLS는 올바르게 동기화 된 프로그램에 적용되는 보증을 제공하지 않습니다.

+0

Marko Topolnik, 답변 해 주셔서 감사합니다.나는 내 이해가 맞는지 아닌지를 모른다. 그렇지 않다면 수정해라. "스레드들 사이의 휘발성 병을 공유하는 프로그램은 아마도 데이터 경쟁을 포함 할 수 없다", " 프로그램) 휘발성에 쓰기 전에 휘발성의 읽기를 포함 "아직 올바르게 동기화 된 프로그램의 실행이지만, 데이터 경주의 현재 정의에 따르면,"실행은 데이터 경주가 포함되어 있으므로 "프로그램이 올바르게 동기화되지 않습니다 ''. – newman

+0

위에서 언급 한 데이터 경합의 보장 및 현재의 정의에 따르면, 우리는 모순 된 결론을 얻을 수 있기 때문에 "위에서 언급 한 보증을 적용 할 수없는 것 같습니다." – newman

+0

모순은 없지만 ** spirit **과 ** letter ** 사이에 충돌이 있습니다. * 편지 *는 휘발성 병을 공유하는 프로그램이 ** 동기화가 잘못되어 있다고 말합니다 **; * spirit *은 ** 정확하게 동기화 되었음 **을 분명히합니다 **. –

관련 문제