이번에 L사 면접에서 싱글턴 패턴에 자세히 물어봐서 대답을 잘하지 못하였다. 그래서 이번에 다시 공부를 해보려 한다.
싱글턴 패턴(Singleton Pattern)
싱글턴 패턴은 최초에 한번만 메모리를 할당하여 생성된 인스턴스 하나로 계속 사용하는 패턴이다.
두 번째 이용시부터 객체 로딩 시간이 줄어 성능이 좋아진다. 하지만 싱글턴 인스턴스가 너무 많은 일을 하거나 많은 데이터 공유를 할 경우 개방-폐쇄 원칙을 위배하고, 멀티 쓰레드에서 동기화 처리를 안하면 문제가 발생한다.
그래서 꼭 사용해야할 경우에만 사용 하는 것이 좋다.
고전적인 싱글턴 패턴
위와 같은 코드는 멀티스레드 환경에서 동시에 접근을 함으로써 한 개 이상의 인스턴스가 생성됨으로써 문제가 발생한다.
Synchronized
위와 같이 synchronized를 사용함을써 해결을 할 수 있으나 속도가 느려져 성능이 저하된다.
DCL(Double Checking Locking)
위와 같이 두번 체크를 함으로써 초기에 객체를 생성하지 않으면서 동기화하는 부분을 줄여서 해결 하였다. 하지만 멀티 환경에서 하나의 CPU를 제외하고는 다른 CPU가 lock에 걸림으로써 완전 해결 한 것은 아니다.
Holder에 의한 초기화
위와 같이 클래스안에 클래스를 만들어서 JVM의 클래스가 로드 되는 시점을 이용한 방법을 사용하여 해결 하였다.
getTest 매서드가 호출되기 전까지는 싱클턴 인스턴스를 생성하지 않고 getTest가 호출 될 때 TestHolder가 참조되고 싱글턴 인스턴스가 생성된다. Lazy Initialization 기법을 사용하기 때문에 메모리 점유율 에서 유리하고,synchronized를 사용하지 않았기 때문에 성능적인 문제도 발생하지 않는다.