'JAVA'에 해당되는 글 51건
- 2008.12.27 공유메모리와 액션 1
공유 메모리는 모든 쓰레드가 공유하고 있는 기억 영역으로 heap memory라고 합니다.
인스턴스는 모두 공유 메모리에 확보되기 때문에 인스턴스가 가지고 있는 필드도 공유 메모리 상에 존재하게 된다.
new를 사용하면 공유 메모리에 영역이 확보되는 것입니다.
지역변수는 공유 메모리 상에 없습니다.
지역변수 이외에도 메소드의 가인수, catch절에 적혀있는 예외 핸들러의 파라미터 등은 공유 메모리 상에
존재하지 않고 대게 쓰레드가 각자가 가지는 스택에 확보됩니다.
(실제로 스택에 확보될지 여부는 JVM의 구현에 의존한다. 지역변수등이 공유 메모리에 확보되지 않는다.)
normal read/normal write 액션은 일반적인 필드의 읽기 쓰기를 표현하며 이들 액션은 캐시를 매개로 이루어진다.
따라서 normal read로 구해지는 값이 반드시 최신 값이라고 할 수 없습니다.
volatile read/ volatile write 액션은 volatile 필드의 읽고 쓰기를 나타냅니다.
이들 액션은 캐시를 매개하지 않습니다.
volatile read로 읽은 값이 항상 최신은 값이며, volatile write로 적은 값은 곧바로 다른 쓰레드에 보입니다.
volatile 필드는 인스턴스가 특정 상태에 있는지를 조사하는 flag로 자주 사용됩니다.
long, double 필드라도 volatile한 필드이면 대입이 최소 단위로 이뤄지는 것이 보증합니다.
lock/unlock 액션은 synchronized로 배타제어를 실행하기 위한 처리입니다.
unlock 액션을 실행하면 캐시에 적힌 내용을 공유 메모리에 강제적으로 쓰기 시작합니다.
lock 액션을 실행하면 캐시의 내용을 무효화하고 공유 메모리로부터 강제적으로 수정하여 읽습니다.