volatile 키워드
멀티코어 프로세서는 별도의 캐시를 가지고 있다
코어는 메모리에서 읽은 값을 캐시에 저장한다.
작업을 처리할 때 캐시에서 먼저 확인하고 없으면 메모리에서 호출하여 처리한다.
그러다보니 도중에 메모리에 저장된 변수의 값이 변경되었는데
캐시에 저장된 값이 갱신되지 않아서
스레드가 멈추지 않고 계속실행되는 경우가 있다.
그래서 volatile 키워드를 이용할 경우
코어는 작업을 처리할 때 캐시가 아닌 메모리에서 불러와 처리하기 때문에
캐시와 메모리간의 불일치 문제가 해결된다.
변수에 volatile 키워드를 붙이는 대신 synchronized 블록을 이용할 때도 같은 효과를 얻을 수 있다.
스레드가 synchronized 블럭으로 진입할 때와 나올 때, 캐시와 메모리간의 동기화가 이루어지기 때문에 정보의 불일치가 해소 되기 때문이다.
JVM은 데이터를 4바이트 단위로 처리하므로 int보다 작은 타입은 한번에 읽거나 쓰는 것이 가능하다.
하나의 명령으로 더이상 나눌 수 없는 최소단위므로 작업 중간에 다른 스레드가 끼어들 틈이 없다.
그치만 long와 double은 8byte변수이기 때문에 하나의 명령으로 값을 읽거나 쓸 수 없어서 다른 스레드가 끼어들 여지가 있다.
그래서 이 문제를 해결하기위해 volatile 을 붙인다.
(상수 fianl 은 Thread에 safe 하다)
volatile long val1;
volatile double val2;
volatile은 해당 변수에 대해 읽고 쓰기가 원자화된다.
(작업을 더 이상 나눌 수 없게 한다는 의미)
volatile은 변수를 읽거나 쓰기를 원자화 할 뿐 동기화하는 것은 아니다.
'Language > Java' 카테고리의 다른 글
[Java] Generic(제네릭) (0) | 2023.04.20 |
---|---|
[병렬프로그래밍] 6. 작업실행 (0) | 2017.04.25 |
NIO TCP blocking channel 소켓서버 & 클라이언트 (0) | 2017.03.30 |
비동기 파일채널 (0) | 2017.03.29 |
NIO (0) | 2017.03.29 |