- 따로 이름도 모르고 사용해 왔던 녀석이 싱글톤패턴이구나...
추가로 멀티 스레딩시의 문제점을 해결한 부분까지 추가.
public class SingletonPattren {
/*
* 클래스를 전역변수에 사용하게되면, 프로그램 실행 시 클래스를 로드하게됨.
* 클래스의 크기가 클 경우 사용하지 않을 때에도 메모리를 소비함. gc도 될 수 없음.
*
*
* Multi-threading에서 발생하는 문제 해결방법
* 1.getInstance를 동기화시킴
* => 호출시마다 오버헤드 발생
* 2.무조건 해당 클래스가 생긴다면 정적 초기화(선언부)시 생성
* 3. DCL(Double-checking locking) 사용 - volatile with class synchronize
* => 처음 instance를 생성할 때에만 동기화를 하므로써
* getInstance()시 발생하는 오버헤드를 줄일 수 있음
*
* - 주의사항
* 클래스 로더를 두개 이상 사용할 경우는 인스턴스가 여러개 생길 수 있음
* => 클래스 로더를 수동으로 지정하여 해결가능
* java 1.5 이후부터 제대로 동작(이전 컴파일러는 DCL을 정상적으로 체크하지 못함
* => 1.5 이하 버전이라면 2번의 방법을 사용하여 해결가능
* java 1.2이전 버전에서는 전역 reference가 없으면 메모리를 해제하는 문제가 있었음
* => 싱글턴 레지스트리 사용
*
*/
private volatile static SingletonPattren m_oInstance;
private SingletonPattren(){
}
public static SingletonPattren getInstance(){
//Lazy instantiation - 게으른 인스턴스 생성
if (m_oInstance == null)
{
synchronized (SingletonPattren.class) {
//null check 필요
if (m_oInstance == null)
m_oInstance = new SingletonPattren();
}
}
return m_oInstance;
}
}
참고자료 : Head first design pattren - singleton pattren
댓글 없음:
댓글 쓰기