synchronized 가 가시 성 을 보장 할 수 있 는 지 여부 입 니 다.

문장http://blog.csdn.net/taotao4/article/details/42744871volatile 의 가시 성 을 검증 한 적 이 있 습 니 다. 아침 에 일어나 면 자바 에서 자주 사용 하 는 동기 화 키워드 synchronized 가 가시 성 을 보장 할 수 있 는 지 에 대해 명확 하 게 언급 하지 않 았 습 니 다.synchronized 키 워드 를 추측 하여 가시 적 인 보증 이 될 수 없 기 때문에 이전 블 로그 의 코드 검증 을 수 정 했 습 니 다. t1 스 레 드 에 synchronized 키 워드 를 추 가 했 을 뿐 입 니 다.
코드 는 다음 과 같 습 니 다:
 
코드 의 실행 결 과 는 '리 셋 되 었 습 니 다' 라 는 말의 출력 을 영원히 볼 수 없습니다.즉, 뒤의 t1 스 레 드 max = null 의 결 과 는 위의 thread [i] 의 모든 스 레 드 를 볼 수 없다.
다시 참조 문장:http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#incorrectlySync
synchronized 는 같은 모니터 에 들 어 가 는 스 레 드 에 대한 가시 성 을 보장 합 니 다.예 를 들 어 스 레 드 th1 은 변 수 를 수정 하고 모니터 를 종료 하기 전에 변 수 를 v1 로 새로 고 친 메 인 메모리 에 있 습 니 다.스 레 드 t2 가 이 모니터 에 들 어 갔 을 때 어떤 프로세서 가 변수 v1 을 캐 시 했다 면 먼저 캐 시가 효력 을 잃 은 다음 에 메 인 메모리 에 변수 v1 을 다시 불 러 와 야 합 니 다. (이 점 은 volatile 과 비슷 합 니 다.)여기 서 의미 의 해석 은 같은 모니터 에 대해 변수의 가시 성 은 일정한 방식 으로 찾 을 수 있 고 같은 모니터 가 아니면 보장 되 지 않 는 다 는 것 이다.
본 논문 의 코드 예 시 는 같은 모니터 의 조건 에 부합 되 지 않 기 때문에 이것 이 있 으 면 보이 지 않 는 것 도 정상 이다.
테스트 플랫폼:
os x 10.10.2 
cpu i5
java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b14)
Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode)

좋은 웹페이지 즐겨찾기