-
☝️싱글톤(Singleton) 패턴IT 2025. 6. 24. 15:52
클래스의 생성자를 private으로 선언하고, 클래스 내부에서 단 하나의 인스턴스를 생성한 뒤 외부에서는 이 인스턴스만을 사용할 수 있도록 하는 디자인 패턴을 싱글톤(Singleton) 패턴이라고 합니다. 싱글톤 패턴은 인스턴스를 재사용함으로써 메모리 낭비를 방지할 수 있으며, 주로 로깅 서비스나 데이터베이스 연결 객체처럼 하나의 인스턴스만 존재해야 하는 경우에 사용됩니다.
🌧️ 문제점
멀티 스레드를 사용하는 환경에서는 동시성 문제가 발생할 수 있습니다. 예를 들어, 여러 스레드가 동시에 인스턴스를 생성하려는 조건에 도달하면, 싱글톤이 여러 개 생성되어 멀티톤이 될 위험이 있습니다.
☀️ 문제 해결
- Synchronized멀티 스레드를 동기화해 한 번에 하나의 스레드만 생성하도록 보장하지만, 성능이 저하되며 이러한 성능 저하는 호출 시 마다 발생합니다.
- Double-checked Locking 인스턴스가 null일 때만 Synchronized 블록에 진입하게해 속도 저하와 동시성 문제를 방지합니다.
✅ 기본 싱글톤 클래스
public class Singleton { // 1. static으로 정적 객체 선언 private static Singleton instance; // 2. 생성자를 private으로 선언해 외부에서 new로 생성 못 하도록 막음 private Singleton() { System.out.println("싱글톤 인스턴스 생성!"); } // 3. getInstance() 메서드를 통해 인스턴스를 제공 public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); // 최초 1회만 생성 } return instance; } // 4. 테스트용 메서드 public void printMessage() { System.out.println("싱글톤 인스턴스 사용 중!"); } }
✅ 사용 예시
public class Main { public static void main(String[] args) { Singleton s1 = Singleton.getInstance(); Singleton s2 = Singleton.getInstance(); s1.printMessage(); // 주소 비교 System.out.println("s1 == s2 ? " + (s1 == s2)); // true → 동일 인스턴스 } }
✅ 결과 출력
싱글톤 인스턴스 생성! 싱글톤 인스턴스 사용 중! s1 == s2 ? true
✅ Double-checked Locking
public class Singleton { private static volatile Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); // 한 번만 생성 } } } return instance; } }
위와 같이 instance가 null인지 먼저 확인 후 동기화 블록에 접근해 동시성 문제를 해결법의 단점을 극복 할 수 있습니다.
'IT' 카테고리의 다른 글
❎ CORS에 관하여 (0) 2025.06.20