2013-07-16 2 views
1

나는 약간의 디자인 패턴에 대해 배우고 놀라운 싱글 톤을 발견했다!싱글 톤 쓰레드를 안전하지 않게 만들 때

싱글 톤 패턴을 구현하는 주요 방법은 두 가지가 있습니다. 하나는 스레드 안전 (synchronized 키워드 사용)이고 다른 하나는 스레드로부터 안전하지 않습니다.

이 아닌 경우은 싱글 톤 스레드를 안전하게 만들려고합니까? 원래의 프로그램 디자인이 쓰래드를 구현하지 않더라도, 미래의 반복이 그 필요성을 가질 것이라고는 말할 수 없을 것입니다. 싱글 톤 스레드를 안전하게 만들 때 성능 저하가 있습니까? 아니면 싱글 톤 thread-safe에 유리하지 않은 곳에서 내가 놓친 다른 이유가 있을까요?

예 스레드 안전 싱글 :

/** 
* Thread Safe Singleton Pattern 
* 
*/ 
public class Database { 
    private volatile static H2 uniqueInstance; 

    public static H2 getInstance() { 
     if (Database.uniqueInstance == null) { 
      synchronized (Database.class) { 
       if (Database.uniqueInstance == null) { 

        /** 
        * Instantiate First and Only instance of H2 
        */ 
        Database.uniqueInstance = new H2(); 
       } 
      } 
     } 
     return Database.uniqueInstance; 
    } 
    private Database() {}; 
} 

예 비 스레드 안전 싱글 :

/** 
* Non Thread Safe Singleton Pattern 
* 
*/ 
public class Database { 
    private volatile static H2 uniqueInstance; 

    public static H2 getInstance() { 
     if (Database.uniqueInstance == null) { 

      /** 
      * Instantiate First and Only instance of H2 
      */ 
      Database.uniqueInstance = new H2(); 
      } 
     } 
     return Database.uniqueInstance; 
    } 
    private Database() {}; 
} 
+0

(현대) Java에서 싱글 톤을 만드는 적절한 방법을 고려하십시오 (Josh Bloch 또는 [이 기사] (http://www.informit.com/articles/article.aspx?p= 1216151 & seqNum = 3))은 자동 스레드 안전성을 초기화하는 "enum"을 사용하는 것입니다 ... 왜 당신이 원했을 지 모르겠습니다. –

답변

2

당신은 당신이 사용하고 Thread의를 포함하지 않는 것을 알고 프로그램을 작성하는 경우 그러면 동기화이 필요하지 않습니다. 사용중인싱글 불변 또는 다음 중 하나 동기화를 사용할 필요가 없습니다 변경 가능한 상태가없는 경우

.

기본적으로 사용자의 목적, 변경 가능한 상태 (또는 하나의 부족) 및 사용자의 싱글 톤의 가능한 용도에 따라 다릅니다.

그냥 부두로 : 싱글 톤 패턴뿐만 아니라 많은 경우에 상식입니다.

+0

스레드를 안전하게 만드는 데 벌칙이 있습니까? use-use의 변경이나 다른 누군가가 쓰레드에서 그것을 사용하려고 할 때를 대비하여 thread-safe로 향하는쪽으로 "더 안전"해 보인다. – SnakeDoc

+1

필요할 때만 쓰레드를 안전하게 만든다. 그렇지 않으면 코드가 혼란스럽고 오버 헤드가있을 수 있습니다. java 동시 패키지 ('AtomicInteger'와 같은 클래스)를 사용하여 문제를 완전히 없앨 수 있습니다. 동기화가 정말로 필요하다면'Lock'을 대신 사용할 수 있습니다. 관련 클래스의 Java 문서를 확인하십시오. –

+1

문제를 완전히 제거하려면 싱글 톤에 대해 'enum'을 사용하십시오. http://www.informit.com/articles/article.aspx?p=1216151&seqNum=3 –

1

컬렉션이없는 표준 방법이나 간단한 클래스의 경우 여러 스레드로 작업하지 않아도 동기화 할 수 있습니다. 그러나 목록을 작업하는 경우 특히 컬렉션을 올바르게 배치하여 동기화하면 성능이 크게 저하됩니다. 여기

은 동기화 된 키워드의 성능에 미치는 영향에 대한 몇 가지 기본 팁 : 당신이 클래스 스레드 안전하기 만의 게으른 초기화을하지 않는의 예를 제공 한 어떤

http://www.javaperformancetuning.com/tips/synchronization.shtml#REF1

0

그것은 스레드로부터 안전합니다.

응용 프로그램 서버 환경에서 모든 단일 리소스는 동시 사용을 허용해야하지만 서비스 시작 중 초기화가 단일 스레드에서 수행되도록 보장 할 수 있습니다. 스스로 묻는 질문은 "이 인스턴스를 느리게 초기화해야합니까 아니면 응용 프로그램 시작 중에 만들 수 있습니까?" 배포 시간이 빠르지 만 요청을 처리하는 데 100 % 필요한 리소스를 게으르게 할당하는 것은 큰 이점이 아닙니다.