// Java (case1)
public class Singleton {
public static Singleton instance = null;
static {
instance = new Singleton();
}
public static Singleton getInstance() {
retrurn Singleton() {
}
}
}
// Java (case2)
class Singleton {
private static class singleInstanceHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return singleInstanceHolder.INSTANCE;
}
}
singleInstanceHolder라는 내부클래스를 하나 더 만듦으로써, Singleton 클래스가 최초에 로딩되더라도 함께 초기화가 되지 않고, getInstance()가 호출될 때 singleInstanceHolder 클래스가 로딩되어 인스턴스를 생성한다.
인스턴스 생성 여부를 싱글톤 패턴 잠금 전에 한 번, 객체를 생성하기 전에 한 번, 2번 체크하면 인스턴스가 존재하지 않을 때만 잠금을 걸 수 있다.
// Java
public class Singleton {
private volatile Singleton instance;
privatd Singleton() {
}
public Singleton getInstance() {
if (instance == null) {
**synchronized** (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instacne;
}
}`
volatile

메인 메모리 위에 CPU 캐시메모리라고 불리는 L3, L2, L1 캐시가 있다.
(L4도 드물긴 하지만 L4까지 CPU 캐시 메모리라고 부른다.)
enum의 인스턴스는 기본적으로 스레드세이프(thread safe한 점이 보장되기 때문에 이를 통해 생성할 수 있다.