티스토리 뷰

Singleton Pattern - 디자인 패턴

참고서적 :  Head First Design Pattern
소스코드 다운로드 : http://www.wickedlysmart.com/headfirstdesignpatterns/code.html
 
패턴 정의 #6 - Singleton Pattern
싱글턴 패턴 (Singleton Pattern)은 해당 클래스의 인스턴스가 하나만 만들어지고,
어디서든지 인스턴스에 접근할 수 있도록 하기 위한 패턴입니다.  
 
가장 널리 사용하는 디자인 패턴이 아닌가 합니다.
굳이 디자인 패턴을 모르더라도 자바 프로그래밍에서 자주 사용하기도 하죠~~  
 
싱글턴 패턴은 클래스에서 자신의 단 하나뿐인 인스턴스를 관리하도록 만들면 됩니다.
그리고 다른 어떤 클래스에서도 자신의 인스턴스를 추가로 만들지 못하도록 해야 합니다.
인스턴스가 필요하면 반드시 클래스 자신을 거치도록 해야 되겠죠..
 

 
- uniqueInstance 클래스 변수에 싱글턴의 유일무이한 인스턴스가 저장됩니다.
- getInstance() 메소드는 정적 메소드, 즉 클래스 메소드입니다.
그냥 Singleton.getInstance() 라는 코드만 사용하면 언제 어디서든 이 메소드를 호출할 수 있습니다.
전역 변수에 접근하는 것만큼이나 쉬우면서도 게으른 인스턴스 생성을 활용할 수 있다는 장점을 제공합니다.
- 싱글턴 패턴을 구현한다고 해서 여기 있는 Singleton 클래스처럼 간단해야 하는 것은 아닙니다.
그냥 일반적인 클래스를 만들 때와 마찬가지로 다양한 데이터와 메소드를 사용할 수 있습니다.
 
싱글턴 패턴을 사용할 경우, 한가지 고려해야 할 사항이 바로 멀티스레딩 관련 문제입니다.
두 개의 쓰레드가 동시에 생성할 경우, 인스턴스가 두 개 생길 수도 있다는 것이죠..
 
그래서 이에 대한 해결책으로 다음과 같은 세가지 방법을 사용합니다.
참고하시기 바랍니다.
 
1. synchronized 키워드를 사용한다.
 
synchronized로 동기화 하게 되면 비용 측면에서의 문제가 발생할 수 있으므로
getInstance()의 속도가 그리 중요하지 않을 경우, 사용해야 한다고 합니다.



2. 인스턴스를 필요할 때 생성하지 말고, 처음부터 만들어 버린다.
 
실행중에 만들지 않고 처음부터 Singleton 인스턴스를 만드는 방법입니다.
 
클래스가 로딩 될 때, JVM에서 Singleton의 유일한 인스턴스를 생성한다고 합니다.
그러므로 JVM에서 유일한 인스턴스를 생성하기 전에는 어떤 쓰레드도 uniqueInstance 변수에 접근할 수 없습니다.
 


3. DCL(Double Checking Locking)을 써서 getInstance()에서 동기화 되는 부분에 대한 체크를 줄입니다.
 
DCL은 Java 5 이전 버전에는 사용할 수 없습니다. 즉, 1.4 버전에서는 지원이 안된다는 것이죠~
어쨌든 동기화를 체크하는 부분이 처음에만 이루어지므로 성능에 큰 영향을 주지 않게 됩니다.



volatile 키워드를 사용하면 멀티쓰레딩을 쓰더라도 uniqueInstance 변수가 Singleton 인스턴스로 초기화 되는 과정이 올바르게 진행되도록 할 수 있습니다.
 
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함