2014-08-28 5 views
2

다음과 같이하면 프로그램에 스레드가 2 개 밖에 없습니다.휘발성 변수가있을 때 재정렬이 가능합니까?

// Thread 1 
write a = 0 
write a = 1 
write volatile b = 1 

// Thread 2 
read volatile b // this I always do after write volatile b in the 1st thread 
read a 

나는 자바 메모리 모델에 읽은 내가 스레드 2에서 이해하는 것과 read a은 항상 나에게 1

이 나의 이해가 정확한지 아닌지 내가 알고 싶습니다을 줄 것이다.

특히 REORDERING은 여전히 ​​HAPPEN이므로 두 번째 스레드에서 = 0을 볼 수 있습니까?

답변

2

귀하의 가정은 대부분 정확합니다. 그러나, JMM이 보장하는 것과 일치시키기 위해 약간 재 설명 할 것입니다. 스레드 2 b을 읽어보고

경우 말했듯이 스레드 2는 항상을 작성하는 스레드 1 개 완료 "후"b을 읽는 경우 값 1은 다음 a의 연속 읽기, 1. 것, 그 다음 2 볼 스레드 값 1과 a의 읽기는 예상대로됩니다.

+0

스레드 1에서 왜 재정렬이 발생할 수 없는지 아직 이해할 수 없습니다. 이유는 0이 될 수 없습니까? 아아아, 그냥 이해 못 하겠어, 제발, JLS 사양을 참조하십시오. –

+0

@Alex - 링크 된 질문에 대한 답변은 JLS를 참조합니다. 기본적으로 휘발성 쓰기 후에는 쓰기를 이동할 수 없으며 휘발성 읽기 전에 어떤 읽기도 이동할 수 없습니다. – jtahlborn

관련 문제