Singleton 인스턴스를 호출할 때만 정적 클래스로 선언하기 ✅

// 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 클래스가 로딩되어 인스턴스를 생성한다.

이중 확인 잠금(DCL, Double Checked Locking)

인스턴스 생성 여부를 싱글톤 패턴 잠금 전에 한 번, 객체를 생성하기 전에 한 번, 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

Untitled

메인 메모리 위에 CPU 캐시메모리라고 불리는 L3, L2, L1 캐시가 있다.

(L4도 드물긴 하지만 L4까지 CPU 캐시 메모리라고 부른다.)

enum 사용 ✅

enum의 인스턴스는 기본적으로 스레드세이프(thread safe한 점이 보장되기 때문에 이를 통해 생성할 수 있다.