singleton은 두가지 문제를 해결한다.
1. 클래스가 하나의 인스턴스만을 가진다.
singleton을 구현하는 방법은 공통적으로 두가지 step이 있다.
정부는 singleton pattern의 가장 딱 들어맞는 예시이다.
국가는 한개의 정부를 가진다.
정부를 구성하는 개인들과 무관하고 특정 국가의 정부라는 말은 정부에 대한 global한 point가 된다.
public class Singleton {
private static Singleton instance;
public String value;
private Singleton(String value) {
this.value = value;
}
public static Singleton getInstance() {
if (Objects.isNull(instance)) {
instance = new Singleton();
}
return instance;
}
}
public class Singleton {
private static volatile Singleton instance;
public String value;
private Singleton(String value) {
this.value = value;
}
/**
* DCL(double checked-lock)이 적용되어 race condition을 방지한다.
* @param value
* @return
*/
public static Singleton getInstance(String value) {
Singleton result = instance;
if (Objects.nonNull(result)) {
return result;
}
synchronized (Singleton.class) {
if (Objects.isNull(instance)) {
instance = new Singleton(value);
}
return instance;
}
}
}
singleton instance를 얻는 getInstance는 thread safe해야 하기 때문에, mutex lock이 추가될 필요가 있다.
멀티 스레딩 환경에서 thread safe하지 않으면 getInstance가 반복해서 생성자를 호출하게 될 수 있다.
추가로 singleton에서 lock을 획득하는데는 double checked locking이 적용되면 성능이 훨씬 상향된다.