나는 SO가시성 차이가 읽고 휘발성
Difference between synchronization of field reads and volatile
여기질문자로부터 다음과 같은 기사를 읽고 보장하기 위해
동기화의 요점은을 씁니다 의 값 이 스레드가 읽는 acct.balance는 최신 값이며 acct.balance에있는 객체 필드에 쓰기를 대기중인 도 모두입니다.3210은 주 메모리에 기록됩니다.
가장 인기있는 답 :
당신은 정확합니다.
public class VolatileTest { static/* volatile */boolean done = false; public VolatileTest() { synchronized (this) { } } public static void main(String[] args) throws Exception { Runnable waiter = new Runnable() { public void run() { while (!done) ; System.out.println("Exited loop"); } }; new Thread(waiter).start(); Thread.sleep(100); // wait for JIT compilation synchronized (VolatileTest.class) { done = true; } System.out.println("done is true "); } }
내 PC에이 프로그램이 종료되지 않습니다
이 코드를 연구하십시오.
따라서 나는 휘발성 변수를 변경하면 내가 사방 미결제에 대한 또 다른 스레드 에 실제 값을 볼 수
- 생각!
- I는 "A"는 I는
는 I 맞죠 (다른 스레드에서 예) 모니터 "A"에서만 동기 부분의 실제 값을 참조 할 모니터 동기 부분의 변수를 변경하는 경우? 휘발성 쓰기 이 발생-전에 때문에 기록 된 값이 변수에서 읽을 수 있습니다
"메인 메모리"라는 용어는 여기에 느슨한 용어입니다. 그것은 단지 일관된 관점을 의미합니다. L2 캐시는 이러한 일이 일어나도록하기 위해 서로 대화를하기 때문에 메인 메모리는 물론 L3 캐시에 변경 사항이 없을 수도 있습니다. –
@ Peter Lawrey 나는 CPU에 대해 충분한 지식이 없다. 나는 아무 것도 이해하지 못했습니다 – gstackoverflow
캐시가 동기화 상태를 유지하는 방법에 대해 설명합니다. http://en.wikipedia.org/wiki/Cache_coherence 일반적으로 캐시는 디자인 상 캐시가 빠를수록 주 메모리를 우회하여 서로 이야기합니다. 이것은 CPU 캐시 http://en.wikipedia.org/wiki/CPU_cache –