1 분 소요

프레임워크나 라이브러리를 공부 하실때 자주 만나는 패턴인 싱글톤 패턴에 대한 포스팅입니다.

정의

해당 클래스의 인스턴스가 하나만 생성되고 어디서든지 그 인스턴스에 접근할 수 있도록 하기 위한 패턴

해당 예시 코드들은 head first design patterns에서 추천하는 예시코드를 가져왔습니다.

인스턴스를 미리 만들지 않고 필요할 때 생성하는 코드.

public class SingletonStatic {

  private volatile static SingletonStatic uniqueInstance;

  private SingletonStatic() {}

  public static SingletonStatic getInstance() {
    if (uniqueInstance == null) {
      synchronized (SingletonStatic.class){
        if (uniqueInstance == null) {
          uniqueInstance = new SingletonStatic();
        }
      }
    }
    return uniqueInstance;
  }
}

단순히 static으로 선언하여 get으로 인스턴스를 가져오는 경우는 멀티쓰레딩 환경에서 싱글턴 패턴을 적용하다 보면 큰 문제가 있습니다.
(하나만 생성되어야 할 인스턴스가 두 개 생성될 수도 있다)
그래서 DCL(Double Checking Locking) 방식을 써서 getInstance에서 동기화 영역을 줄일 수 있습니다.
하지만 이 방법은 단점이 있습니다 멀티코어 환경에서 동작할 때 하나의 cpu를 제외하고는 다른 cpu가 lock에 걸린다고 합니다.

인스턴스를 처음부터 생성하는 코드

제가 애용하는 방식입니다.

public class Singleton {
	private static Singleton uniqueInstance = new Singleton();
    
    private Singleton() {}
    
	  public static Singleton getInstance() {
    
    	  return uniqueInstance; 
    };
}

애플리케이션에서 반드시 Singleton의 인스턴스를 생성해야 하고 그 인스턴스를 항상 사용한다면 또는 인스턴스를 실행 중에 수시로 만들고 관리하기가 어렵다면 처음부터 Singleton인스턴스를 생성하는 것도 좋은 방법입니다.
클래스가 로딩될 때 JVM에서 Singleton의 유일한 인스턴스를 생성해줍니다.
JVM에서 유일한 인스턴스를 생성하기 전에는 그 어떤 스레드도 uniqueInstance 정적 변수에 접근할 수 없습니다.


추가로
Voliate 멀티 쓰레딩 환경에서 동기화를 해주는 키워드입니다.
java 변수를 메인 메모리에 저장하겠다를 명시합니다.
Multi Thread 환경에서 하나의 Thread만 read & write 하고 나머지 Thread가 read 하는 상황에서 가장 최신의 값을 보장합니다.

예제 코드는 https://github.com/Picbel/TIL.designPattern 참고부탁드립니다.

댓글남기기