이전에 답변을 받았을 수 있지만 문제가 복잡하기 때문에 확인이 필요합니다. 그래서 질문을 바꿉니다Java에서 동기화 된 키워드의 메모리 효과
질문 1 : 스레드가 동기화 된 블록에 들어갈 때 메모리 바리어는 내가 동기화 한 객체의 필드뿐만 아니라 어떤 필드도 포함하게됩니까? 많은 객체가 동기화 된 블록 내에서 수정되면 스레드 메모리 캐시간에 많은 양의 메모리 이동이 발생합니다.
Thread 1
object.field1 = "";
synchronized (lock) {
farAwayObject.field1 = "";
farAwayObject.evenFarther.field2 = "";
}
Thread 2. assuming thread ordering is correct
synchronized (lock) {
//thread 2 guaranteed to see all fields above as ""
//even object.field1 ?
}
질문 2 :되는 일이-전에 관계의 스레드에서 object.field1 = "";
1 개 암시 적 부분?
희망이 있지만 그렇지 않을 수도 있습니다. 동기화 블록에 넣지 않고 그렇게 만들 수있는 트릭이 없다면? 프로그램에서 추론하기가 어렵습니다. 그리고 모든 것을 동기화 된 {} 아래에 두는 것은 실용적이지 않습니다.
EDIT : 설명 : object.field1은 휘발성이 아니며 질문은 "스레드 2가 최소한 스레드 1의 쓰기를 보장합니다."라는 질문입니다. 내 질문은 메모리 가시성에 관한 것입니다. 논증을 위해서 쓰레드 1 만 비 휘발성 object.field1에 쓰는다고 가정 해 봅시다.
고쳐 될 수있다이 문제
로"윌 같은 잠금 장치에 동기화 다른 스레드에 의해 볼 수 전에 만든 잠금 푸시 변화에 동기화 된 블록?"
대답은 두 질문에 모두 예입니다. – shmosel
@shmosel'object.field1'은 happen-before의 일부가 아니며'Thread2'가 업데이트를 보거나 보지 않을 수도 있다는 것을 이해했습니다. – CKing