2011-11-23 2 views
1

JVM이이 링크에 따라 공유 변수의 데이터를 주 메모리에서 스레드의 작업 메모리로 복사하여 동기화를 수행한다는 것을 읽었습니다.메모리 모델에서 자바 동기화

enter link description here

예를 들어, 같은 클래스가있다. 이 테스트 클래스가 여러 스레드에서 실행되고 "print2"방법은 하나 개의 스레드에서 실행되는 경우

class Test { 
private Test2 test2 = new Test2(); 

public void print1() {} 

public synchronized void print2() { 
    test2.print(); 
} 

}

, 나는 시험에 대한 잠금이 하나 개의 스레드와 다른 스레드에 의해 인수되는 것을 기다릴 필요가 생각 자물쇠가 풀릴 때까지

이제 질문이 있습니다. Test에 대한 잠금이 Thread에 의해 획득되면 Test와 Test2의 데이터가 주 메모리에서 스레드의 작업 메모리로 복사된다는 의미입니까? 내가 말하고있는 이유는 "synchronized"키워드가 인스턴스 메소드 레벨에서 사용되고 test2가 Test 클래스의 인스턴스 변수라는 것입니다.

주 메모리에서 스레드의 작업 메모리로 복사되는 내용을 명확하게하려고합니다.

내가 잘못하면 저를 교정하십시오.

답변

1

간단히 말해, 동기화를 사용할 때 모든 공유 변수가 복사 (즉, 캐시에서 주 메모리로 작성되므로 모든 스레드가 동일한 데이터를 갖습니다)됩니다. 휘발성을 사용할 때 휘발성 변수 하나만 복사 할 수 있습니다.

이 내용은이 주제와 관련된 유용한 자료입니다.

http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html


편집 :

는, T는 임의의 스레드에하자 V 어떤 변수가 될도록합니다 : 귀하의 코멘트에 관해서는 specification의 섹션 17.6 귀하의 질문에 대한 대답 L 자물쇠 야. 변수 V, 할당 또는 부하에 T에 의해 L에 T에 의해 잠금 조치 및 후속 사용 또는 저장 작업을 사이

: V 및 L에 대한 T가 수행 한 작업의 특정 제약이 있습니다 V에 대한 조치가 개입해야합니다. 또한로드 동작 인 경우 해당로드에 대한 에 해당하는 읽기 작업은 주 메모리에서 볼 수있는 잠금 동작을 따라야합니다. () 정식 적으로 : 잠금 동작은 스레드의 작업 메모리 인 에서 모든 변수를 플러시하는 것처럼 작동하므로 사용 전에 할당하거나 을 주 메모리에서로드해야합니다.)

+0

메서드 수준에서 "synchronized"를 사용하는 대신 synchronized 블록을 사용하면 어떻게됩니까? 개체 잠금 = 새 개체(); – user826323

+0

@ user826323이 질문에 대답 할 수 있도록 내 기억을 새롭게해야했습니다. 내 업데이트 답변을 참조하십시오. 모든 공유 변수는 잠금을 사용할 때 주 메모리에서 가져옵니다. – Bryan

0

동기화는 적어도 하나의 작성자 및 리더 스레드가있는 경우에만 필요합니다. 동기화 할 필요가없는 것을 수정하지 않으므로.

복사 할 수있는 유일한 것은 참조 번호 test2이며 이는 아마도 레지스터에 저장됩니다. 이것은 귀하의 방법이 동기화되었는지 여부와 상관없이 발생합니다.

+0

이 클래스는 아무 것도 수정하지 않는다는 것을 알고 있습니다. 이것은 단지 예일뿐입니다. 나는 JVM에서 동기화가 일어날 때 복사되는 것을 알아 내려고하고있다. – user826323

+0

그래서 String s = "test"와 같은 또 다른 인스턴스 변수가 있다면, 이것 역시 복사 될 것입니다. – user826323

+0

글쎄, 실제로는 예제에 작가가 *있다. 'private Test2 test2 = new Test2();'는 쓰기 작업을 수행합니다. – yair