Kaboom

[Design Pattern]5. Singleton Pattern 본문

Design Pattern

[Design Pattern]5. Singleton Pattern

akawarren 2012. 11. 12. 17:39
  • Lazy Instantiation : 싱글턴 객체를 필요한 상황이 닥치기 전에는 생성하지 않고 있게 됨.
  • 싱글턴 패턴 : 해당 클래스의 인스턴스가 하나만 만들어지고, 어디에서든지 그 패턴에 접곤할 수 있기 휘한 패턴임.
  • 멀티쓰레드에서 접근 가능하기 때문에 동기화된 상태로 유지해야 함.
  • getinstance() 코드 블럭 전체를 동기화 시킬 때 발생하는 문제 - 불필요한 성능 저하
    • 해결 방법 : 속도가 별 상관 없다면 그냥 둔다.
    • 인스턴스 생성을 클래스 로딩 타임에 하도록 코드를 수정한다.
    • Double-Checking Locking 사용
      • 인스턴스가 NULL 일 때만 동기화 블록을 써서 생성하는 동안에만 적용
      • volatile keyword in JAVA : volatile는 각기 다른 thread가 같은 값을 보도록(visibility) 보장. volatile은 컴파일러가 특정 변수에 대해 옵티마이져가 캐슁을 적용하지 못하도록 하는 키워드. 이문제는 멀티 쓰레드에서 while문 이나 for문이 옵티마이져에 의해 캐쉬를 사용하는데, 변수 변경을 감지하지 못할 수 있음. 즉 동기화 문제가 발생할수 있음. 예를 들어 한쓰레드에서 다른 쓰레드의 작업이 마치기를 기다리면 while문을 돌고 있는데 volatile 키워드를 사용하지 않은 변수를 사용하면 캐쉬를 해버려 영원히 루프를 빠저 나오지 못하는 경우가 발생함. 물론 동기화 객체를 이용하는 것이 정석인데 volatile 키워드를 사용해도 작동함.

Comments