2013-05-11 4 views
0

이것은 멀티 스레드 응용 프로그램에서 사용하기 위해 항상 스레드 안전 싱글 톤을 만든 방법입니다. 내가 공부스레드 안전 싱글 톤 및 내부 클래스 솔루션

public class Logger { 

    private Logger() {} 

    private static Logger instance = new Logger(); 

    public static Logger getInstance() { 
     return instance; 
    } 

    public void log(String s) { 
     // Log here 
    } 
} 

오늘은 내 자바 인증을하고 책에 나는이 다른 해결책을 발견 :

public class Logger { 

    private Logger() {} 

    private static Logger instance; 

    private static class LoggerHolder { 
     public static Logger logger = new Logger(); 
    } 

    public static Logger getInstance() { 
     return LoggerHolder.logger; 
    } 

    public void log(String s) { 
     // Log here 
    } 
} 

그들은 다른 하나에 대해 언급하지 않는다.

무엇이 더 좋습니까? 두 솔루션의 차이점은 무엇입니까?

답변

1

두 번째 예제는 클래스에 액세스했기 때문에 인스턴스를 만들 가능성이 적습니다. 대신 내부 클래스에 액세스해야합니다. 이 수준의 편집증은 JDK 라이브러리 디자이너에게는 의미가 있지만보다 제어 된 코드 기반에서는 최고의 IMHO를 능가합니다.

내가 충분히 혼란 한 내장을 포함하여 사용할 수있는이 클래스의 많은 구현을 통해 이미 있습니다 단순함을 선호 Logger라는 클래스를 생성에 대해이 대신

public enum MyLogger { 
    INSTANCE; 

    public void log(String s) { 
     // log here 
    } 
} 

난 강력하게 추천 사용할 수 있습니다.

0

두 번째 것은 게으름입니다. 어떤 기적에 의해 프로그램이 클래스를로드하지만 getInstance()을 호출하지 않으면 생성하려는 값 비싼 객체 일 수있는 로거 인스턴스가 생성되지 않습니다.

솔직히 말해서, 싱글 톤이 정말로 필요하다면 (그리고 의존성 주입 프레임 워크에서는 거의 항상 불필요합니다), 나는 이해하기 쉬운 첫 번째 솔루션을 선호합니다. 클래스가로드되었지만 실제 코드에서는 사용되지 않은 싱글 톤을 본 적이 거의 없습니다.