Java/Design Pattern

[헤드퍼스트 디자인 패턴] 5. 싱글턴 패턴

noahkim_ 2024. 12. 16. 23:56

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다

 

1. 싱글턴 패턴

  • 애플리케이션에 하나만 있어도 되는 객체
  • 두개 이상일 경우
    • 자원을 불필요하게 많이 잡아먹음
    • 결과에 일관성 X
  • 전역 접근 가능
    • 필요할 때만 객체를 생성할 수 있음

 

사용

  • 스레드 풀, 캐시, 다이얼로그, 디바이스 드라이버, 설정 등

 

2. 구현

public class Singleton {
    private static Singleton uniqueInstance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (uniqueInstance == null) uniqueInstance = new Singleton();
        
        return uniqueInstance;
    }
}
  • 정적 메서드
  • 생성자 비공개

 

3. 멀티스레딩 문제

public class Singleton {
    private static Singleton uniqueInstance;

    private Singleton() {}

    public static synchronized Singleton getInstance() {
        if (uniqueInstance == null) uniqueInstance = new Singleton();
        
        return uniqueInstance;
    }
}
  • 한 스레드가 메소드 사용을 끝내기 전까지 다른 스레드는 기다리도록 함

 

효율적인 방법

Eager initialization
public class Singleton {
    private static Singleton uniqueInstance = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() return uniqueInstance;
}

 

Double-Checked Locking
public class Singleton {
    private volatile static Singleton uniqueInstance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (uniqueInstance != null) return uniqueInstance;

        synchronized (Singleton.class) {
            if (uniqueInstance == null) uniqueInstance = new Singleton();
        }
    }
}
  • 인스턴스가 생성되어 있지 않았을때만 동기화됨

 

Enum
public enum Singleton {
    INSTANCE;
    
    public void doSomething() {
        //...
    }
}
  • Eager Initialization
    • 동기화 문제, 클래스 로딩 문제 해결
  • jvm에 의해 한번만 인스턴스화됨
    • 리플렉션 문제 해결
      • 내부적으로 final 키워드가 선언되어 있으므로 추가 생성 불가
    • 직렬화 & 역직렬화 문제 해결
      • 직렬화 시 새로운 인스턴스가 생성될 수 있음.
      • 그러나, 새로운 객체 생성 X.
      • INSTANCE가 반환됨