2014-11-21 6 views
0

싱글 톤 패턴을 구현 중이며 초기화는 스레드로부터 안전해야합니다.스레드 안전 싱글 렛 정적 메소드 초기화

나는 이중 체크 잠금 구현을 사용하는 것과, 그것을 할 수있는 몇 가지 방법, 또는 다른 기술을 본 것 (예 : http://csharpindepth.com/articles/general/singleton.aspx) 내가 알고 싶어

경우 네 번째 버전과 유사 다음과 같은 접근 방식, 이 기사에서는 스레드로부터 안전합니다. 기본적으로 인스턴스를 만드는 정적 필드 초기화 프로그램에서 메서드를 호출하고 있습니다. 나는 게으름을 걱정하지 않는다. 감사!

public static class SharedTracerMock 
{ 
    private static Mock<ITracer> tracerMock = CreateTracerMock(); 

    private static Mock<ITracer> CreateTracerMock() 
    { 
     tracerMock = new Mock<ITracer>(); 
     return tracerMock; 
    } 

    public static Mock<ITracer> TracerMock 
    { 
     get 
     { 
      return tracerMock; 
     } 
    } 
} 

답변

3

는 네, 스레드 안전 - 당신의 클래스 자체의 인스턴스가 없기로는, 일반 싱글 톤 패턴하지 비록. 그것은 "단일 값 공장 패턴"의 이상입니다. 클래스는 정확히 한 번만 초기화되고 (리플렉션을 사용하여 형식 초기화 프로그램을 호출하지 않는 경우) 한 스레드에서 초기화되는 동안 TracerMock을 요청하는 다른 스레드는 대기해야합니다.

코드는 또한 비록 방법을 제거하여 단순화 할 수 있습니다 명확성의 측면에서 도움이 내가 읽기 전용뿐만 아니라 필드했습니다

public static class SharedTracerMock 
{ 
    private static readonly Mock<ITracer> tracerMock = new Mock<ITracer>(); 

    public static Mock<ITracer> TracerMock { get { return tracerMock; } } 
} 

참고. 나는 일반적으로 한 줄에 사소한 게터를 모두 붙이기 때문에 중괄호가있는 대량의 줄을 피하기 위해 (한 줄의 return 문에 대한 코드 7 줄은 과도한 느낌이 들었다). 이 부동산 스레드 안전이 개체가 반환 것을 의미하지 않는다 단지 때문에, 물론

public static class SharedTracerMock 
{ 
    public static Mock<ITracer> TracerMock { get; } = new Mock<ITracer>(); 
} 

: C# 6에서

,이 읽기 전용 자동으로 구현 된 속성을 사용하여 더욱 단순화 할 수있다 스레드 안전성에 대한 참조는 ... Mock<T>에 대해 알지 못하면서 실제로 알 수 없습니다.

+0

Jon 님, 많은 도움을 주셔서 감사합니다. –

+0

C# 6 부분이 좋았습니다. – Disposer

관련 문제