2017-02-23 8 views
0

을이 질문은 JMM 우려 : 구체적미묘한 순간됩니까-전에 관계

: https://www.cs.umd.edu/~pugh/java/memoryModel/jsr133.pdf

당신이 JMM 사양에서 다음 식을 (이 13 페이지의 섹션 5) 설명시겠습니까 두 작업이 발생하기 전에 관계를 공유하는 경우 관계 이전에 발생한 모든 코드와 의 순서대로 발생하지 않아도됩니다. 예를 들어, 다른 스레드에서 읽기와 데이터 경주에있는 하나의 스레드에서 쓰기는 이러한 순서로 발생하는 것으로 나타날 수 있습니다.

가능한 경우이 문제를 반영하는 실행 추적을 제공하십시오.

답변

0

당신이 인용 한 단락 앞에있는 단락은 행동 a가 행동 b와 사전 - 관계에 있다는 사실이 b가 실제로 실행되기 전에 a가 실제로 실행된다는 것을 의미하지 않는다. 예를 들어, 코드에서

x = 10; 
y = 20; 

두 쓰기 동작을 니펫을하는 것은 그들이 동일한 스레드에서 발생하기 때문에이 관계-전에 일어난다에 있습니다. 그러나 이러한 스와핑은 스레드 자체에서 볼 수 없으므로 실제로는 (JVM 또는 프로세서에 의해 컴파일러에 의해) 스왑 될 수 있습니다.

그러나 다른 스레드에서 볼 수 있습니다 (Java 메모리 모델에서 특별히 허용됨). 어떤 형태의 동기화없이이 두 변수를 읽는 다른 스레드는 x가 10으로 변경되기 전에 y가 20으로 변경된다는 것을 관찰 할 수 있습니다. 동기화가 없으면 쓰기가 데이터 읽기에서 다른 스레드)