2010-04-22 7 views
8

Java에서 변수를 volatile으로 표시하면 모든 스레드가 일부 부실 값 대신 마지막으로 쓰여진 값을 확인합니다. 나는 이것이 실제로 어떻게 성취되었는지 궁금해하고있었습니다. JVM이 CPU 캐쉬 또는 다른 것을 플러시하는 특별한 지침을 내 보냅니 까?volatile은 실제로 어떻게 작동합니까?

+0

관련 질문 (실제로는 목록의 첫 번째 ..) http://stackoverflow.com/questions/1787450/how-do- i-understand-read-memory-barriers-and-volatile – BalusC

+0

그리고 순서가 잘못된 실행과 관련하여 "upvotes"및 "즐겨 찾기"가 많은 휘발성 메모리에서 시작한 스레드가 있습니다. http://stackoverflow.com/questions/2441279/java-volatile-guarantee-and-order-execution – SyntaxT3rr0r

답변

8

필자가 이해 한 바로는 마치 캐시가 쓰기 후에 플러시 된 것처럼 보이며 읽기가 메모리에서 곧바로 읽혀지는 것처럼 항상 나타납니다. 결과적으로 스레드는 항상 다른 스레드와 (Java 메모리 모델에 따라) 캐시 된 값의 쓰기 결과를 볼 수 있습니다. 그러나 실제 구현 및 CPU 명령어는 아키텍처마다 다를 수 있습니다.

둘 이상의 스레드에서 변수를 증가 시키거나 값을 확인하고 실제 동기화가 없으므로 어떤 조치를 취하는 경우 정확성을 보장하지 않습니다. 일반적으로 변수에 쓰는 쓰레드 만 있고 다른 변수는 모두 읽으면 올바른 실행 만 보장 할 수 있습니다.

또한 64 비트 비 휘발성 변수는 두 개의 32 비트 변수로 읽고 쓸 수 있으므로 32 비트 변수는 쓰기시 원자 단위이지만 64 비트 변수는 그렇지 않습니다. 한 반은 다른 값보다 먼저 쓰여질 수 있으므로 읽은 값은 이전 값 또는 새 값보다 낮을 수 있습니다.

내 책갈피에 상당히 도움이되는 페이지입니다 :

http://www.cs.umd.edu/~pugh/java/memoryModel/

+2

@jgubby : 마지막 단락이 올바르지 않은 것 같습니다. 하나의 쓰기에서 32 비트, 다른 쓰기에서 32 비트를 가진 64 비트 휘발성을 읽을 수 없습니다. – SyntaxT3rr0r

+1

@WizardOfOdds : 동의 함. 말하자면 비 휘발성 변수가 있습니다. – gubby

+0

@jbuggy : 아아, 그게 내가 생각한 것인데, 나는 네가 의미하는 것이 확실하지 않아서 당신의 글을 편집 할 수 없었다. :) 다행스럽게도 혼란 스러웠 기 때문에 도움이 되었기 때문에 기쁘다.))) – SyntaxT3rr0r

1

정확하게 어떤 일이 발생하는지는 프로세서마다 다릅니다. 일반적으로 몇 가지 형태의 메모리 장벽 지침이 있습니다. 캐시 전체를 비우는 것은 분명히 매우 비쌉니다. 하드웨어에는 캐시 일관성 프로토콜이 있습니다.

필드 액세스를 통해 특정 최적화가 이루어지지 않는 것이 중요합니다. 컴파일러는 멀티 스레딩을 고려할 때 중요합니다. 하드웨어에 대해서만 생각하지 마십시오.

+1

올바르게 작성된 Java 프로그램에서 정확히 발생하는 것은 프로세서마다 다릅니다. – gubby

+0

@jgubby 특별한 지시 사항이 나오면 질문하는 것입니다. –

관련 문제