5장 - 싱글턴 패턴

Created
2022/09/03 11:29
Tags
디자인패턴

싱글턴 패턴이란

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

고전적인 싱글턴 패턴

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

단점

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

조금 개선된 싱글턴 패턴

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

장점

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

단점

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

조금 더 개선된 싱글턴 패턴

public class Singleton { private static Singleton uniqueInstance = new Singleton(); private Singleton() {} public static synchronized Singleton getInstance() { return uniqueInstance; } }
Java
복사
방법1 - 인스턴스를 처음부터 만들어준다.
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; } }
Java
복사
방법2 - DCL을 사용하여 동기화 코드를 줄인다.

volatile

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