2014-04-27 5 views
0

두 인스턴스가 동시에 getInstance에 액세스 할 수 있고 _instance가 null이고 Singleton 클래스의 두 인스턴스를 만드는 경우 새 인스턴스 생성을 동기화하는 이유를 읽습니다. 그래서 그것을 제거하기 위해 우리는 그것을 동기화했습니다. 그러나 다시 한번 이중 검사 잠금 방법이 인스턴스가 Synchronized 블록 내부에서 null인지 다시 확인하는 방법을 다시 설명합니다. 필요한가? 코드 블록이 동기화되면 이미 스레드 안전을 알고 있습니까?스레드 안전이있는 싱글 톤 디자인 패턴

public class Singleton { 
     private static Singleton _instance = null; 

     private Singleton() { } 

     public static Singleton getInstance() { 
       if (_instance == null) { 
         synchronized (Singleton.class) { 
          _instance = new Singleton(); // why need to again check null 
         } 
       } 
       return _instance; 
     } 
} 
+0

가능한 복제본 [Java의 지연 스레드 안전 싱글 톤 인스턴스 생성 패턴] (http://stackoverflow.com/questions/3635396/pattern-for-lazy-thread-safe-singleton-instantiation-in-java) – user1937198

답변

0

synchronized 블록 _instance = new Singleton() 두 번째 전화가 처음을 무시할 수 있기 때문에 (즉, 한 번에 하나 개의 스레드)하지만이 충분하지 순차적으로 실행한다.

첫 번째 스레드가 _instance == null 표현식을 평가 한 직후 하나의 컨텍스트 전환이 발생하고 또 다른 스레드가 _instance == null 표현식을 평가할 때까지 다른 컨텍스트 전환이 발생하지 않는 것이 그럴듯한 시나리오입니다.

따라서, 한 번 synchronized 블록 내부에, 현재의 thread는 _instancenew Singleton()로 설정하기 전에 여전히 null 있는지 확인해야한다.