ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ☝️싱글톤(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
Designed by Tistory.