Java에서 변수를 volatile
으로 표시하면 모든 스레드가 일부 부실 값 대신 마지막으로 쓰여진 값을 확인합니다. 나는 이것이 실제로 어떻게 성취되었는지 궁금해하고있었습니다. JVM이 CPU 캐쉬 또는 다른 것을 플러시하는 특별한 지침을 내 보냅니 까?volatile은 실제로 어떻게 작동합니까?
답변
필자가 이해 한 바로는 마치 캐시가 쓰기 후에 플러시 된 것처럼 보이며 읽기가 메모리에서 곧바로 읽혀지는 것처럼 항상 나타납니다. 결과적으로 스레드는 항상 다른 스레드와 (Java 메모리 모델에 따라) 캐시 된 값의 쓰기 결과를 볼 수 있습니다. 그러나 실제 구현 및 CPU 명령어는 아키텍처마다 다를 수 있습니다.
둘 이상의 스레드에서 변수를 증가 시키거나 값을 확인하고 실제 동기화가 없으므로 어떤 조치를 취하는 경우 정확성을 보장하지 않습니다. 일반적으로 변수에 쓰는 쓰레드 만 있고 다른 변수는 모두 읽으면 올바른 실행 만 보장 할 수 있습니다.
또한 64 비트 비 휘발성 변수는 두 개의 32 비트 변수로 읽고 쓸 수 있으므로 32 비트 변수는 쓰기시 원자 단위이지만 64 비트 변수는 그렇지 않습니다. 한 반은 다른 값보다 먼저 쓰여질 수 있으므로 읽은 값은 이전 값 또는 새 값보다 낮을 수 있습니다.
이
내 책갈피에 상당히 도움이되는 페이지입니다 :@jgubby : 마지막 단락이 올바르지 않은 것 같습니다. 하나의 쓰기에서 32 비트, 다른 쓰기에서 32 비트를 가진 64 비트 휘발성을 읽을 수 없습니다. – SyntaxT3rr0r
@WizardOfOdds : 동의 함. 말하자면 비 휘발성 변수가 있습니다. – gubby
@jbuggy : 아아, 그게 내가 생각한 것인데, 나는 네가 의미하는 것이 확실하지 않아서 당신의 글을 편집 할 수 없었다. :) 다행스럽게도 혼란 스러웠 기 때문에 도움이 되었기 때문에 기쁘다.))) – SyntaxT3rr0r
정확하게 어떤 일이 발생하는지는 프로세서마다 다릅니다. 일반적으로 몇 가지 형태의 메모리 장벽 지침이 있습니다. 캐시 전체를 비우는 것은 분명히 매우 비쌉니다. 하드웨어에는 캐시 일관성 프로토콜이 있습니다.
필드 액세스를 통해 특정 최적화가 이루어지지 않는 것이 중요합니다. 컴파일러는 멀티 스레딩을 고려할 때 중요합니다. 하드웨어에 대해서만 생각하지 마십시오.
올바르게 작성된 Java 프로그램에서 정확히 발생하는 것은 프로세서마다 다릅니다. – gubby
@jgubby 특별한 지시 사항이 나오면 질문하는 것입니다. –
- 1. FBConnect는 실제로 어떻게 작동합니까?
- 2. UpdatePanel은 실제로 어떻게 작동합니까?
- 3. Eventbug는 실제로 어떻게 작동합니까?
- 4. applicationName 속성은 실제로 어떻게 작동합니까?
- 5. XSS 공격이 실제로 어떻게 작동합니까?
- 6. 이 pthread가 실제로 어떻게 작동합니까?
- 7. 플래시 dispatchEvent가 실제로 어떻게 작동합니까?
- 8. mw의 lw는 실제로 어떻게 작동합니까?
- 9. random()은 실제로 어떻게 작동합니까?
- 10. opcode 캐시가 실제로 어떻게 작동합니까?
- 11. 입력 태그는 실제로 어떻게 작동합니까?
- 12. scanf()는 실제로 어떻게 작동합니까?
- 13. List :: Util '셔플'은 실제로 어떻게 작동합니까?
- 14. Jinja2 "재귀"태그는 실제로 어떻게 작동합니까?
- 15. SharePoint 배포 서비스는 실제로 어떻게 작동합니까?
- 16. JUnit TestCase 기능이 실제로 어떻게 작동합니까?
- 17. 웹 사이트 액세스 제어는 실제로 어떻게 작동합니까?
- 18. CPU 레지스터에 쓰기가 실제로 어떻게 작동합니까?
- 19. MemCacheStore는 실제로 여러 서버에서 어떻게 작동합니까?
- 20. Android 사운드 믹싱은 실제로 어떻게 작동합니까?
- 21. 실제로 CLR 레벨에서 주물이 어떻게 작동합니까?
- 22. Twitter API의 서명은 실제로 어떻게 작동합니까?
- 23. JQuery는 실제로 WebView에서 작동합니까?
- 24. Flash10 + p2p가 실제로 작동합니까?
- 25. virtualenv relocatable - 실제로 작동합니까?
- 26. Android Twitter OAuth가 실제로 작동합니까?
- 27. MySQL에서 디스플레이 너비가 실제로 작동합니까?
- 28. DotNetOpenAuth OpenId Provider가 실제로 작동합니까?
- 29. SOA 서비스 검색 (UDDI)은 실제로 어떻게 작동합니까?
- 30. 날짜/시간대에 관한 다음 코드는 실제로 어떻게 작동합니까?
관련 질문 (실제로는 목록의 첫 번째 ..) http://stackoverflow.com/questions/1787450/how-do- i-understand-read-memory-barriers-and-volatile – BalusC
그리고 순서가 잘못된 실행과 관련하여 "upvotes"및 "즐겨 찾기"가 많은 휘발성 메모리에서 시작한 스레드가 있습니다. http://stackoverflow.com/questions/2441279/java-volatile-guarantee-and-order-execution – SyntaxT3rr0r