2014-01-07 3 views
-2

나는 게터도 동기화되어야한다는 것을 이해하지만, 코드 아래에 주어진자바 - 동기화 게터

Object get() { return val; } 

synchronized void set(Object val) { ... } 

어떻게 수 (MEM에서 간단한 읽기) 원자 인 컴파일러 엉망 간단한 return 문,? 프로세서 별 캐시와 관련이 있습니까?

+0

컴파일러가 어떻게 간단한 return 문을 엉망으로 만들 수 있습니까? –

+0

나에게 분명하지 않다. –

+0

게터가 항상 동기화되어야한다고 생각하는 이유는 무엇입니까? – Mureinik

답변

5

이 경우 멤버 변수 valvolatile으로 선언하면 충분합니다.

문제의 범위는 입니다. 메모리 장벽이 없으면 한 스레드에서 작성된 변경 사항이 다른 스레드에서 볼 수있게된다는 보장이 없습니다. 장벽이 없으면 JVM은 멤버 변수의 값을 전역 적으로 볼 수있는 주 메모리에 변경 사항을 쓰는 대신 레지스터에 캐싱하는 것과 같은 최적화를 할 수 있습니다.

0

반환 문은 반환 형식에 따라 기본이 아닐 수도 있습니다. 기본적으로 4 바이트 이상을 반환하면 더 이상 원자 적이 아닙니다. this question

+1

레퍼런스의 경우에는 항상 원자 적이다. – assylias