접영잘하고싶다
30
2022-08-05 17:00:30 작성 2022-08-05 17:16:58 수정됨
2
640

자바 또는 비슷한 언어에서, 멀티 스레드 환경에서 싱글톤 구현에 대해 질문 있습니다.


안녕하세요

문득. 아이러니한게. 보통 싱글톤 클래스의 인스턴스는 

static final이 잖아요? 그럼 아무리 멀티스레드 환경에서 인스턴스가 두 개 이상 생성되었을지 언정.

결국엔 싱글돈 클레스의 static 인스턴스는 어떤 순서로 생성이 됐건. 최종적으로 하나의 인스턴스만 생성이 되기 때문에. 

비록 초기에 낮은 확률로 두 개의 인스턴스가 생성되는 문제가 있지만.. 결국엔 하나의 인스턴스만 갖는다는 원칙을 준수하기 때문에 별다른 문제가 없는거 아닌가요? 

스텍오버플로 질문도 해봤는데. 싱글톤 인스턴스가 원식 값 즉, int, long, double 이라면 문제가 없다.

단, list와 같은 인스턴스이면 static final 이 더라도 상호 다른 객체를 바라본다는데. 이해가가질 않습니다. 


---- 참고 -----

Q) static instance may be 'final', Isn't it okay to have a multi-threaded environment?

Anyway, eventually, an instance is created.

Is there any other problem that I didn't think of?


A) If your static final field is an int then yes, all threads will always read the same value. If your static final field is a List then no, threads may see different contents even if the list is static final. So it really depends on what the object is. --> 이게 가능한 일인지? 이해가 가질 않습니다.




0
  • 댓글 2

  • 카놀라유
    1k
    2022-08-05 22:16:15

    제가 알기로는 A와 B 두개의 스레드가 하나의 싱글톤 객체를 참조할때,

    서로 다른 두개의 싱글톤 객체가 생성될 위험이 있다고 알고 있습니다.

    말씀하신대로 일반적인 상황에서는 진짜 별 상관이 없겟지만,

    서비스 사용자가 몰리는 등 참조가 자주 일어나면 문제가 발생할수도 있다고 생각합니다.

    그리고 그로 인해 발생한 문제는 단순하게 디버깅으로 찾기가 힘들죠...

  • 엡실론
    3k
    2022-08-06 04:31:05

    static final은 한번만 생성됩니다. 위에 언급된 답변은 List가 변경가능 하기 때문입니다. 언제든 에이터를 넣고, 삭제할 수 있으니 인스턴스는 하나지만 스레드세이프 하지는 않습니다. Guava의 ImmutableList 같은걸 사용하면 안전하게 멀티스레드에서 사용가능합니다.

  • 로그인을 하시면 댓글을 등록할 수 있습니다.