Open HYK97 opened 1 year ago
메모리 가시성을 확보하기 위한 키워드입니다.
멀티 스레드 환경에서 공유 변수를 어떤 스레드가 수정했을 때 그 값을 다른 스레드가 읽을 수 있는지에 대한 성질이 가시성입니다.
volatile를 붙인 공유 변수를 사용하게 되면 공유 변수를 read / write 할 때는 캐시 된 데이터를 읽지 않고 main memory의 데이터를 읽어옵니다.
Instruction Reordering 또한 방지해 주기 때문에 항상 모든 스레드가 변수의 최신 값을 볼 수 있도록 합니다.
멀티 스레드 환경에서 리소스에 대한 액세스를 제어한다는 키워드 입니다. (원자적 연산)
synchronized
키워드가 선언되면 한 번에 하나의 스레드만 메서드/코드블럭를 실행할 수 있습니다.
class Example {
private int a;
private boolean flag = true;
public void up() {
if (flag) {
a++;
flag=false;
continue;
}
flag=true;
}
}
만약 이런코드가 있고 멀티스레드 환경에서 up() 을 실행했을때 제대로 값을 얻을수 있습니다. 그이유는 1번스레드가 flag -> false로 바꾸기전에 다른 여러스레드들이 해당 코드 블록 내부로 진입할수있기 때문입니다.
synchronized
, volatile
는 둘다 동기화에 관련된 키워드지만
synchronized
는 동기화할 대상이 행위(연산) 이고 volatile
의 동기화 대상은 타깃(객체,변수) 입니다.
volatile은 하나의 스레드로 write를 나머지 스레드들은 read를 할 때 사용해 볼 수 있습니다.
synchronized는 원자적 연산을 지원하기 때문에 여러 스레드가 read/write 할 때 사용할 수 있습니다.
volatile , synchronized 키워드들은 어떨 때 사용하고 어떤 뜻을 가지고 있나요?
키워드
volatile
,synchronized
,동기화
,가시성