나는 게터도 동기화되어야한다는 것을 이해하지만, 코드 아래에 주어진자바 - 동기화 게터
Object get() { return val; }
synchronized void set(Object val) { ... }
어떻게 수 (MEM에서 간단한 읽기) 원자 인 컴파일러 엉망 간단한 return 문,? 프로세서 별 캐시와 관련이 있습니까?
나는 게터도 동기화되어야한다는 것을 이해하지만, 코드 아래에 주어진자바 - 동기화 게터
Object get() { return val; }
synchronized void set(Object val) { ... }
어떻게 수 (MEM에서 간단한 읽기) 원자 인 컴파일러 엉망 간단한 return 문,? 프로세서 별 캐시와 관련이 있습니까?
이 경우 멤버 변수 val
을 volatile
으로 선언하면 충분합니다.
문제의 범위는 입니다. 메모리 장벽이 없으면 한 스레드에서 작성된 변경 사항이 다른 스레드에서 볼 수있게된다는 보장이 없습니다. 장벽이 없으면 JVM은 멤버 변수의 값을 전역 적으로 볼 수있는 주 메모리에 변경 사항을 쓰는 대신 레지스터에 캐싱하는 것과 같은 최적화를 할 수 있습니다.
반환 문은 반환 형식에 따라 기본이 아닐 수도 있습니다. 기본적으로 4 바이트 이상을 반환하면 더 이상 원자 적이 아닙니다. this question
레퍼런스의 경우에는 항상 원자 적이다. – assylias
컴파일러가 어떻게 간단한 return 문을 엉망으로 만들 수 있습니까? –
나에게 분명하지 않다. –
게터가 항상 동기화되어야한다고 생각하는 이유는 무엇입니까? – Mureinik