글 검색

공개된 글의 제목과 본문을 검색합니다.

    닫기 Esc

    싱글턴 패턴이란#

    싱글턴 패턴은 클래스 인스턴스를 하나만 만들고, 그 인스턴스로의 전역 접근을 제공합니다.

    • 인스턴스가 절대 2개 이상이 되지 않도록 해 주는 싱글턴 패턴입니다.
    • 연결 풀이나 스레드 풀과 같은 자원 풀을 관리하는 데 자주 사용합니다.
    • 생성자를 private접근자로 제한하고 객체접근을 public static메소드를 통해 접근한다.
    • 자원을 많이 잡아먹는 인스턴스에 유용하다.
    • 싱글턴은 올바르게 구현하기가 어렵다.
    • 싱글턴은 상속받기 어려워서

    고전적인 싱글턴 패턴#

    java
    public class Singleton {
        private static Singleton uniqueInstance;
        private Singleton() {}
        public static Singleton getInstance() {
            if (uniqueInstance == null) {
                uniqueInstance = new Singleton();
            }
            return uniqueInstance;
        }
    }
    고전적인 싱글턴 패턴

    단점#

    • 멀티쓰레드 환경에서 레이스 컨디션 문제로 인해서 인스턴스가 하나가 아닌 2개가 생성될 수 있다.

    조금 개선된 싱글턴 패턴#

    java
    public class Singleton {
        private static Singleton uniqueInstance;
        private Singleton() {}
        public static synchronized Singleton getInstance() {
            if (uniqueInstance == null) {
                uniqueInstance = new Singleton();
            }
            return uniqueInstance;
        }
    }
    synchronized 메소드로 지정한 싱글턴 패턴

    장점#

    • synchronized예약어로 인해서 한개의 스레드가 작업을 마칠때 까지 인스턴스를 가져올 수 없기 때문에 하나의 인스턴스를 보장한다.

    단점#

    • 동기화가 필요한 시점은 오로지 인스턴스의 생성을 진행할 때 뿐이기 때문에 매번 동기화를 하는것은 비효율적임

    조금 더 개선된 싱글턴 패턴#

    java
    public class Singleton {
        private static Singleton uniqueInstance = new Singleton();
        private Singleton() {}
        public static synchronized Singleton getInstance() {
            return uniqueInstance;
        }
    }
    방법1 - 인스턴스를 처음부터 만들어준다.
    java
    public class Singleton {
        private volatile static Singleton uniqueInstance;
        private Singleton() {}
        public static synchronized Singleton getInstance() {
            if (uniqueInstance == null) {
                synchronized (Singleton.class) {
                    if (uniqueInstance == null) {
                        uniqueInstance = new Singleton();
                    }
                }
            }
            return uniqueInstance;
        }
    }
    방법2 - DCL을 사용하여 동기화 코드를 줄인다.

    volatile#

    • volatile keyword는 Java 변수를 Main Memory에 저장하겠다라는 것을 명시하는 것입니다.
    • 매번 변수의 값을 Read할 때마다 CPU cache에 저장된 값이 아닌 Main Memory에서 읽는 것입니다.
    • 또한 변수의 값을 Write할 때마다 Main Memory에 까지 작성하는 것입니다.
    전체 글 둘러보기