Singleton
유일무이한 하나의 객체를 뜻하는 패턴, 스레드 풀이라던지, 로그를 출력하거나 정리하는 객체, 프로세스를 감시하는 객체 등등을 뜻한다. 다만 유일하게 존재해야 하는 이유는 여러가지로 성능, 이상 동작, 자원 절약 등등이 있다.
라고 쓰여 있지만, 딱히 와닿지 않는다. 역시 개발자는 코드를…
Old Singleton
OldSingleton1.java
- 싱글턴일까?
gist:ppzxc/7edda092b2a29977180678e2e377f184#OldSingleton1.java
OldSington2.java
- 싱글턴!
gist:ppzxc/7edda092b2a29977180678e2e377f184#OldSingleton2.java
싱글턴의 정의
싱글턴 클래스는 하나의 인스턴스만 생성되며, 언제든, 어디서든 접근 가능하도록 만들기 위한 패턴
조건
- 싱글턴 클래스는 자기 자신을 하나만 생성해 관리 하도록 구성한다.
- 싱글턴 클래스는 다른 어떤 곳에서도 싱글턴 클래스의 인스턴스를 생성하지 못하도록 막는다.
OldSingleton은 어느 실행 환경에서도 안전할까?
MultiThread 환경에서는 OldSingeton의 if (uniqueInstance == null)
이 문제가 될 수도 있다.
이 될 수도 있다라는 말이 굉장히 애매하게 들리지만, 실제로 잘 돌아갈 수도 있고, 어떨때엔 굉장한 문제 동작을 뿜어낸다.
업무에 쓰이는 Java 프로그램은 멀티 스레드 기반으로 동작을 하는데, 새로운 플랫폼에 다시 개발을 진행하면서 프로그램 전역 변수를 관리하는 클래스가 멀티스레드 환경에서 오동작하는 것을 굉장히 오랜 시간 추적해 잡아낸 적이 있다. 그때도 똑같이 잘 되다가, 오동작하고, 잘되다가 오동작 했으며, 컴파일시 잡히는 오류는 아니기에 굉장히 고생했던 기억이다.
싱글턴의 여러가지 모양새
- 처음부터 초기화, JVM에서 유일하게 생성해 준다.
gist:ppzxc/7edda092b2a29977180678e2e377f184#Singleton3.java
- DCL ( Double Checking Locking )
- volatile 키워드의 자세한 내용은 레퍼런스를 참조
gist:ppzxc/7edda092b2a29977180678e2e377f184#Singleton4.java
- volatile은 해당 키워드가 선언된 변수의 읽기 쓰기만 동기화 하지만, synchronized는 특정 작업 전체를 동기화 가능하다.
- int a = b + 10 을 예로 들면 특정 스레드는 b의 값에 10을 더한 값을 들고 갈 수도 아닐수도 있다.
Reference
- Volatile
- 에릭 프리먼, 엘리자베스 프리먼, 케이시 시에라, 버트 베이츠, 『 Head First Desgin Pattern』, 서환수 옮김, O’Reilly(1999.6.24).