SMALL

Singleton Pattern

 

싱글턴은 자원 공유를 위해 객체 생성 개수를 1개로 제한합니다.

싱글턴은 다른 생성 패턴과 달리 하나의 객체만 생성을 제한하는 패턴입니다.

그리고 생성된 객체는 공유되어 어디서든 접근할 수 있습니다.

출처: https://subscription.packtpub.com/book/application_development/9781786463593/2/ch02lvl1sec19/singleton-pattern

 

싱글턴 패턴은 다음과 같은 상황에서 매우 유용합니다

  • 공유 자원 접근
  • 복수의 시스템이 하나의 자원에 접근할 때
  • 유일한 객체가 필요할 때
  • 값의 캐시가 필요할 때

예시 코드

public class Config {
	
	private static Config instance = null;
	
	private Config() {
		// private constructor
	}
	
	public static Config getInstance() {
		if (instance == null) {
			instance = new Config();
		}
		return instance;
	}
}

위의 예제에서는 multi thread 환경에서 어떠한 thread에서 getInstance를 호출하여 instance를 생성하는 시점에 

다른 thread가 해당 메서드를 호출하는 경우에 문제가 될 수 있습니다.

instance를 생성 중이긴 하지만, instance를 생성이 완료가 되지 않아서 null check 하는 로직에 true로 통과하여 싱글턴이 깨질 수 있습니다.

 

Multi Thread 환경에서의 Singleton

public class MultiThreadConfig {
	private MultiThreadConfig() {}
	
	private static class InnerClz {
		private static final MultiThreadConfig INSTANCE = new MultiThreadConfig();
	}
	
	public static MultiThreadConfig getInstance() {
		return InnerClz.INSTANCE;
	}
}

내부 정적 클래스를 선언하여 그 내부 클래스에서 인스턴스를 생성하도록 하는 방식

 

MultiThreadConfig 클래스에는 InnerClz 클래스의 변수가 없기 때문에, static 멤버 클래스더라도, 클래스 로더가 초기화 과정을 진행할 때 InnerClz 클래스는 초기화되지 않는다.
InnerClz 클래스는 getInstance()가 호출됐을 때 비로소 JVM 메모리에 로드되고, 인스턴스를 생성하게 됩니다.

 

LIST

+ Recent posts