happy-developers / dev-interview

1 stars 1 forks source link

[Java] volatile , synchronized 키워드들은 어떨 때 사용하고 어떤 뜻을 가지고 있나요? #52

Open HYK97 opened 1 year ago

HYK97 commented 1 year ago

volatile , synchronized 키워드들은 어떨 때 사용하고 어떤 뜻을 가지고 있나요?

키워드

volatile, synchronized,동기화,가시성


HYK97 commented 1 year ago

volatile

메모리 가시성을 확보하기 위한 키워드입니다.

가시성이란?

멀티 스레드 환경에서 공유 변수를 어떤 스레드가 수정했을 때 그 값을 다른 스레드가 읽을 수 있는지에 대한 성질이 가시성입니다.

volatile를 붙인 공유 변수를 사용하게 되면 공유 변수를 read / write 할 때는 캐시 된 데이터를 읽지 않고 main memory의 데이터를 읽어옵니다.

Instruction Reordering 또한 방지해 주기 때문에 항상 모든 스레드가 변수의 최신 값을 볼 수 있도록 합니다.

synchronized

멀티 스레드 환경에서 리소스에 대한 액세스를 제어한다는 키워드 입니다. (원자적 연산) 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 의 동기화 대상은 타깃(객체,변수) 입니다.