반응형

Singleton Pattern : 해당 클래스의 객체가 하나만 만들어지고 어디서든지 그 객체에 접근할수 있도록 한다.


(출처 : http://www.phpbuilder.com/columns/Singleton-PHP5/Octavia_Anghel112310.php3)

구현 방법은 간단하다.

  1. public class Singleton {
  2.     private static Singleton singleton;
  3.     private Singleton(){};
  4.    
  5.     public static Singleton getInstance(){
  6.         if (singleton == null){
  7.             singleton = new Singleton();
  8.         }
  9.         return singleton;
  10.     }
  11. }

그런데 위와 같은 방법은 문제가 있다.

멀티 쓰레드 상에서 if문을 여러 client가 통과할 가능성이 있다는것이다.  그렇게 되면 유일한 객체가 아닌 singleton객체가 여러개 생성이 될수 도 있다.

그래서 찾은 방법이 synchronized를 사용하는것.

그런데 또 문제 발생... synchronized를 사용할 경우 멀티 쓰레드 상에서 성능 문제를 발생 시킬수 있다. singleton객체를 별로 안쓴다면 크게 문제가 없겠지만.

그래서 또 나온 방법이 DCL.  Double-Checked Locking

  1. public class Singleton {
  2.     private volatile static Singleton singleton;
  3.     private Singleton(){}
  4.     public static Singleton getInstance(){
  5.         if (singleton == null){
  6.             synchronized (Singleton.class) {
  7.                 if (singleton == null){
  8.                     singleton = new Singleton();
  9.                 }
  10.             }
  11.         }
  12.         return singleton;
  13.     }
  14. }

위에 코드처럼 singleton이 null 인 경우에만 synchronized를 적용한다면 속도에는 크게 지장이 없을것이다.

그리고 java1.4 이후에서 나온 volatile을 선언해 두면 해당 변수가 사용될때 한번 확인해서 동기화 시켜준다. 

728x90
반응형

'Development > Java' 카테고리의 다른 글

Integer.paserInt 를 사용한 진법 변환  (0) 2013.11.12
Null Object 사용  (0) 2013.07.05
List 를 Array로 바꾸는 함수.  (0) 2013.07.02
Annotation : Retention  (0) 2013.07.01
Meta Annotaion  (0) 2013.07.01

+ Recent posts