• 카테고리

    질문 & 답변
  • 세부 분야

    취업 · 이직

  • 해결 여부

    미해결

static 🆚 volatile

23.05.06 22:04 작성 23.05.08 21:12 수정 조회수 546

0

안녕하세요!

 

첫번째 질문은 싱글톤 패턴을 구현하는 7가지 방법 #2. LazyHolder, DCL, ENUM 강의 내용에서

 

  1. static은 인스턴스 메모리를 공유시킴으로서 각 스레드간 의존적이다.

  2. volatile은 각 캐시메모리가 아닌 메인메모리를 공유시킴으로서 각 스레드간 의존적이다.

     

그렇다면 static은 volatile 키워드가 없으므로 메인메모리를 공유하지 않고 각 캐시메모리를 가지는 것인지, 그렇다면 어떻게 인스턴스 메모리가 공유될 수 있는지 궁금합니다.

 

두번째 질문은, 메모리를 공유시킴으로서 각 스레드간 의존적이게 하는 동작은 static도 가능한데 왜 volatile을 사용하는 것인지, static과 volatile의 차이점은 무엇인지 궁금합니다!

답변 1

답변을 작성해보세요.

0

안녕하세요 팡세님ㅎㅎ

  1. static은 인스턴스 메모리를 공유시킴

>> 어떻게 static으로 인스턴스 메모리를 공유시키냐는 말씀이시죠?

static으로 선언된 변수는 클래스로더당 하나의 변수를 공유합니다.

그러나

동일한 클래스의 한 스레드의 업데이트가 다른 모든 스레드에게 바로 반영되지 않습니다. 이는 캐시메모리를 중심으로 동작하기 때문입니다.

 image

앞의 그림처럼 static으로 선언된 staticint는 각각의 스레드내에서 공유되고 있음을 보여줍니다. 그러나 volatile은 각각의 스래드 외에서도 공유되고 있음을 보여줍니다.

 

메모리를 공유시킴으로서 각 스레드간 의존적이게 하는 동작은 static도 가능한데 왜 volatile을 사용하는 것인지, static과 volatile의 차이점은 무엇인지 궁금합니다!

>>

static의 경우 2개 스레드(t1, t2)에서 각각의 캐시메모리에서 동일한 개체의 복사본을 만들어 수정하므로 t1의 업데이트가 t2에 반영되지 않습니다.

public class Test {
    static boolean flag = true;

    public void test() {
        new Thread(()->{
                int cnt = 0;
                while (flag) {
                    cnt++;
                }
                System.out.println("Thread1 finished\n");
            }
        ).start();
        new Thread(()-> {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException ignored) {
                    
                }
                System.out.println("flag to false");
                flag = false;
            }
        ).start();
    }

    public static void main(String[] args) {
        new Test().test();
    }
}

즉 앞의 코드는 무한루프에 걸립니다.

volatile은 강의에서 설명한 것처럼 메인메모리를 중심으로 하기 때문에 그렇지 않습니다.

 

또한, 팡세님 열심히 공부하시는 것, 질문하시는 것은 정말 좋으나 강의 내용을 그대로 블로그에 써놓으셨는데... 강의내용을 블로그에 쓰는 것은 금지하고 있어서요. 비공개 또는 삭제 부탁드립니다.

 

감사합니다.

 

팡세님의 프로필

팡세

질문자

2023.05.08

자세한 설명 감사합니다!

사실 그냥 면접에서 질문받을 목록? 정도의 용도로 블로그에 공부내용을 올리고 있는데 다른 강사님은 강의 자료를 캡쳐하여 사용하지 않으면 가능하다고 하셨거든요... 강의 출처를 링크로 명시하고 포스팅해도 안될까요??ㅠㅠ

안녕하세요 팡세님 ㅎㅎ

공개적으로 포스팅은 불가능할 것 같습니다.

비공개 또는 삭제 부탁드립니다.

감사합니다.

팡세님의 프로필

팡세

질문자

2023.05.09

네 알겠습니다 죄송합니다..

아닙니다. ㅎㅎ 모르시는거 있으시면 또 질문주세요~