Java/Design Pattern

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

noahkim_ 2024. 12. 16. 23:56

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

 

1. 싱글턴 패턴

  • 애플리케이션 전체에서 하나의 인스턴사만 존재하도록 보장하는 디자인 패턴
항목 설명
단 하나의 객체만 필요한 경우 불필요한 객체 생성을 방지하여 자원 절약
결과의 일관성 유지
여러 인스턴스가 존재하면 데이터 충돌 및 상태 불일치 위험 발생
전역 접근 가능
어디서든 동일한 인스턴스에 접근 가능 → 사용 편리
지연 초기화 가능
필요할 때만 객체 생성 → 메모리 등 리소스 효율성 증가

 

예시) 구현

더보기
public class Singleton {
    private static Singleton uniqueInstance;

    private Singleton() {}

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

 

사용

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

 

2. 멀티스레딩 문제

  • 한 스레드가 메소드 사용을 끝내기 전까지 다른 스레드는 기다리도록 함

 

해결 방법

방식 설명 장점 요약
Eager Initialization 클래스 로딩 시 인스턴스를 바로 생성 - 클래스 로딩 시점에 생성됨
- 구현 간단
Double-Checked Locking 인스턴스가 없을 때만 동기화하여 성능 향상
- 필요 시점에만 생성
- 동기화 비용 최소화
- 멀티스레딩 안전
Enum Singleton enum으로 싱글턴 정의 (INSTANCE 사용)
- JVM이 단 한번만 인스턴스 생성
- 리플렉션/직렬화에도 안전
- 내부적으로 final이라 추가 생성 불가

 

예시) 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() {
        //...
    }
}