|
Space Map
|
Singleton Pattern싱글톤 패턴의 목적은 두가지
왜 싱글톤이 필요한가?
기본적인 코드// 싱글턴객체가 필요할 때는 인스턴스를 직접 만드는게 아니고 인스턴스를 달라고 요청을 하는 것이다. public class Singleton { private static Singleton uniqueInstance; private Singleton() {} // <--- 생성자는 private -- 외부에서 new 를 사용하여 객체를 생성할 수 없다... public static Singleton getInstance() { // 객체를 생성하는 static 메소드 하나 if ( uniqueInstance == null ) { // 이 부분은 객체를 처음 생성할 때만 필요하다~~ uniqueInstance = new Singleton(); } return uniqueInstance; } } Single Thread 인 경우 이 정도면 충분할 듯 합니다. 다음은 Multi Thread 환경인 경우에 해당되는 내용입니다. 기본 코드의 멀티 쓰레드에서의 문제점 public class Singleton { private static Singleton uniqueInstance; private Singleton() {} public static Singleton getInstance() { if ( uniqueInstance == null ) { // A Thread가 이 코드를 실행할 때 uniqueInstance = new Singleton(); // B Thread가 객체 생성을 완료하지 않은 경우 } // 두개의 객체가 생성될 수 있다. return uniqueInstance; } } 두개의 객체가 생성될 수 있는 문제를 해결할 수 있는 간단한 방법은 아래와 같다. 수정된 코드
Double-Checking Locking public class Singleton { private volatile static Singleton uniqueInstance; private Singleton() {} // 부분적으로 synchronized를 걸어 객체가 생성된 이후에는 synchronized 구문을 수행하지 않는다. public static Singleton getInstance() { if ( uniqueInstance == null ) { synchronized( Singleton.class ) { if ( uniqueInstance == null ) { uniqueInstance = new Singleton(); } } } return uniqueInstance; } } - 꼭 volatile 키워드가 지정되어야 하고 자바 1.4 이후 버젼에서만( Tiger 부터~~ ) 사용해야 한다. volatile http://blog.naver.com/amebas?Redirect=Log&logNo=120022290373 volatile은 하나의 변수를 여러 쓰레드에서 사용할 때, 사용하는 키워드입니다. 한 변수를 여러 쓰레드에서 사용하게 되면 각 쓰레드마다 해당 변수 값을 저장하는 작업 복사본을 하나씩 가지고 이럴경우 동기화에 문제가 있습니다... 만약 화면에 변수 값을 찍는 작업을 위해 하나의 쓰레드가 자신의 작업 이것을 막기 위해 volatile을 사용하면 쓰레드가 특정 변수를 접근하려는 연산이 발생하면 무조껀 다시 주 원본의 ... 더 깊이 있는 내용을 원한다면...쓰레드에 안전한 싱글톤 클래스를 만드는 세가지 방법 http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=javatip&c=r_p&n=1028393658 Double-checked locking과 Singleton 패턴 http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=javatip&c=r_p&n=1036509257 |
|