2011-05-03 4 views
0

며칠 전에 나는 '휘발성'이라는 키워드를 어떻게 사용하는지 물어 보았다. 여기서 나를 도운 사람들에 대해 다시 한번 감사 드리고 싶습니다. 그러나, 새로운 문제는 내가 지금은 스레드 캐시 메모리에 저장되는 알고 싶어요, (어쩌면 그들에게보다 전문적인 용어가)가 메인 메모리가 있으며 별도의 캐시 메모리를 스레드 알고 현재 그 JMM에 대한 내 마음에 상승 , 공유 객체 참조 사본 (객체 주소 사본) 또는 공유 객체 복사본 예를 들어, 객체를 선언합니다. B b = new B(); B는 B가 스레드에 의해 액세스 될 때 두 개의 스레드에 의해 액세스 B 복사 및 스레드 자신의 캐시 메모리에 저장 또는 복사 스레드 자신의 캐시에 저장되는 B 포인트 객체이다 오브젝트 참조가 될 수있다 기억? 감사.자바 메모리 모델에 관한 질문

답변

3

둘 이상의 스레드가 액세스하는 것은 "스레드 캐시"에있을 수 있습니다. 그것들은 객체의 일부인 경우 참조를 포함합니다. 로컬 변수가 스택에 있고 다른 스레드에서 액세스 할 수 없으므로이 변수는 로컬 변수에 포함 된 참조를 포함하지 않습니다.

그래서 대답은 실제로 "둘 다"입니다.

+0

아래 예제 코드를 잘 이해할 수 없다 : public class Test { \t \t public B b = new B(); \t \t 공공 정적 무효 메인 (문자열 []에 args) { \t \t 새로운 스레드() { \t \t \t 공개 무효 실행() { \t \t \t \t b.setName ("TEST1"); \t \t \t} \t \t} .start(); // 스레드 1 \t \t \t \t 새로운 Thread() { \t \t \t 공공 무효 실행() { \t \t \t \t 나.setName ("test2"); \t \t \t} \t \t} .start(); // thread 2 \t} } thread1과 thread2 액세스 b는 참조 b 복사본과 개체 복사본을 모두 캐시합니까? 복사 b 참조는 복사 객체를 가리키고 원본 신호는 참조하지 않습니다. –

+0

예, "b"필드와 "b"가 참조하는 객체의 데이터는 각 CPU의 캐시에있을 수 있습니다 (스레드 별 캐시와 같은 것은 없습니다). synchronized, volatile 및 final 키워드는 JVM이 CPU 캐시를 읽거나 쓰도록 요구 될 때 제어합니다. –

+0

감사합니다. 그냥 똑같은 코드 예제. thread1에서 "b = null"을 호출하면 b가 '휘발성'으로 선언되지 않았으므로 액세스 할 때 b는 thread2에서 null이 아닐 수 있습니다. 그리고 thread1에서 "b.setName ("test1 ")"을 호출하면 name이 B 클래스에서 '휘발성'으로 선언되지 않으면 thread2의 b.getName() 반환 값이 "test1"이 아닐 수도 있습니다. 감사. –

0

변수 b은 힙에 저장되는 개체에 대한 참조입니다.

0

일반적으로 참조가 저장되는시기와 위치를 알 필요가 없습니다. 기억은 단지 두 단계가 아니라 그보다 훨씬 복잡합니다. 당신이 가진 위에서 아래로.

registers 
L1 cache 
L2 cache 
L3 cache 
local main memory 
nonlocal main memory 
swap space. 

로컬 메인 메모리는 CPU의 로컬 메모리입니다. 다른 CPU에 대해 로컬 메모리를 가질 수 있습니다. 그래서이 메모리 공간은 일반적으로 어딘가 L1 사이의 지역 메인 메모리입니다 일반적으로 TLAB에서 오는 약간의 메모리를 할당 (현지 할당 버퍼 스레드)하는

B b = new B(); 

을 수행 할 수 있습니다. 모든 레벨에 사본이있을 수 있습니다. 그러나 참조는 레지스터에 있어야 로컬 변수에 할당 될 수 있습니다. 스택 및 메모리에 저장 될 수도 있고 그렇지 않을 수도 있습니다.

CPU 내에서도 "레지스터"는 광범위한 범주입니다. 는 CPU가 액세스하고 성능에 큰 영향을 미칠 수있는 놀라운 복잡한 주제가 될 수있는 메모리에 기록하는 방법.