본문 바로가기
컴퓨터과학/디자인패턴

[디자인패턴] 싱글턴 패턴 (Singleton Pattern)

by 윤호 2021. 10. 18.

목적

클래스가 한 개의 인스턴스만을 만들 수 있도록하고, 어디서나 생성된 인스턴스에 접근할 수 있도록

요소

문제: 여러 객체가 생성되면 상태 관리 어려움

해결: 객체 생성자를 중앙 관리

결과: 객체가 한 개임을 보장

구현

1. 기본 생성자을 private 으로 막는다.

2. static 함수로 객체를 생성하도록 함

public class Singleton{
	
	private static Singleton uniqueInstance;

	private Singleton(){} // private으로 생성자 막음

	public static Singleton getInstance(){
		if (uniqueInstance==null){
			uniqueInstance = new Singleton();
		}
		return uniqueInstance;
	}
}

 

해당 클래스를 여러개의 쓰레드가 사용한다면 문제가 생긴다.

 

쓰레드A가 getInstance()의 if문을 통과한 채로 다음 쓰레드로 넘어갔다고 생각해보자.

쓰레드A에서 객체를 생성한건 아니기 때문에 넘어가진 쓰레드B는 if문도 통과하고 객체를 생성했다.

다음 쓰레드A의 차례가 다시 돌아왔을 때, if문을 통과한 상태였기 때문에 B에서 객체를 생성했음에도 또 객체를 생성한다.

 

Thread-safe 버전의 싱글턴

방법1. 객체 생성 함수에 synchronized 를 붙인다.

public class Singleton{
	...
	public static synchronized Singleton getInstance(){
		...
	}
}

문제점: synchronized된 함수가 크기가 클 경우 쓰레드 성능저하

 

방법2. 객체를 static 으로 지정하여 프로그램 실행시 바로 생성하도록 한다.

public class Singleton{
	// static 변수는 프로그램 실행시 메모리에 올라간다.
	private static Singleton inst = new Singleton();
	private Singleton(){}
	public static Singleton getInstance(){
		return inst;
	}
}

문제점: 필요없는 객체여도 프로그램 시작시에 무조건 생성하게 되고, 이는 프로그램 시작시 성능을 저하시킨다.

 

방법3. synchronized를 사용하는데, 동기화되는 부분을 줄이기위해 특정 부분에서만 synchronized하도록. (자바5부터 가능)

댓글