2017-04-16 6 views
0

멀티 스레딩의 경우 싱글 톤 작동 방법을 알고 싶습니다. 2 개의 스레드가 아래 코드와 같이 인스턴스화 코드를 입력하고 첫 번째 스레드가 해당 부분을 잠그는 인스턴스화 코드를 입력하고 다른 스레드가 대기 할 때까지 작업을 계속한다고 가정합니다. 그럼 첫 번째 스레드가 작업을 완료하면 두 번째 스레드가 인스턴스화 코드를 입력합니다. 이제 첫 번째 스레드가 작업을 완료하고 두 번째 스레드가 새 인스턴스를 만들거나 첫 번째 스레드를 공유 할 것이므로 누가 잠금을 해제 할 책임이 있는지 알고 싶습니다. 인스턴스화 ???싱글 톤 클래스의 경우 멀티 스레딩 C#

코드 :

public sealed class Singleton 
{ 
    private static Singleton instance = null; 
    // adding locking object 
    private static readonly object syncRoot = new object(); 
    private Singleton() { } 

    public static Singleton Instance 
    { 
     get 
     { 
      if (instance == null) 
      { 
       lock (syncRoot) 
       { 
        if (instance == null) 
        { 
         instance = new Singleton(); 
        } 
       } 
      } 
      return instance; 
     } 
    } 
} 
+1

[스레드 안전 C# 싱글 톤 패턴] 가능한 복제 (http : // stackoverflow.com/questions/12316406/thread-safe-c-sharp-singleton-pattern) – Sanket

+0

해당하는 경우, 싱글 톤 대신 의존성 주입을 사용하는 것이 좋습니다. 컨테이너는 단일 객체를 가져야하는 모든 클래스를 인스턴스화하며, 객체를 필요로하는 클래스에 ctor를 통해 주입됩니다. Unity는 C#에서 이것을 지원하는 하나의 프레임 워크입니다. – Itsik

답변

0

당신은 이중 체크 잠금, 멀티 스레드 코드에 대한 매우 일반적인 직렬화 패턴이라고 여기 사용했습니다 무엇. 그것은 작동합니다.

lock 범위를 벗어나면 잠금이 자동으로 해제됩니다.

경합이 있다고 가정하면, 한 스레드는 test-> acquire-> test-> initialize-> release를 수행하고 다음은 단순히 test-> acquire-> test-> release : 이중 초기화가 필요하지 않습니다.

0

첫 번째 스레드는 첫번째 스레드가 완료된 이후 작업 2 스레드가 동작 지금은 잠금을 해제 할 책임을 누가 알고 싶어,

각 스레드의 취득을 인스턴스화 코드를 입력합니다 완료되면 개별적으로 잠금을 해제합니다. 첫 번째 스레드가 잠금을 획득합니다. 잠금이있는 동안에는 두 번째 스레드가 잠금을 획득 할 수 없습니다.

첫 번째 스레드가 잠금을 해제하면 (실행이 lock 문에 의해 제어되는 코드 블록을 벗어나면 발생 함) 두 번째 스레드는 잠금을 획득하고 코드를 실행할 수 있습니다. 그런 다음 잠금을 해제하면 잠금이 해제됩니다.

& hellip; 두 번째 스레드가 새 인스턴스를 만들거나 첫 번째 스레드 인스턴스를 공유합니까 ???

싱글 톤은 처음에 보조 필드가 null 인 것으로 관찰되는 경우에도 한 번만 초기화됩니다. lock을 사용하면이 코드를 통해 단 하나의 스레드 만 실제로 싱글 톤 인스턴스를 만들 수 있습니다.

둘 이상의 초기화가 발생할 수있는 변형이 있지만 IMHO는이를 수행하는 방법이 다릅니다.

그렇다면, .NET의 맥락에서 위의 이중 잠금조차도 불필요하게 복잡하다는 의견이 있습니다. 대부분의 경우 간단한 필드 초기화 프로그램을 사용하면 충분합니다. 충분하지 않은 경우에는 Lazy<T> 클래스를 사용할 수 있습니다.

더 자세한 설명은 관련된 스택 오버플로 질문 Thread Safe C# Singleton Pattern과 여기 제공된 참고 자료를 참조하십시오.

+0

Thanks Peter !!!!!! – Pushkar

1

이것을 구현하는 가장 좋은 방법은 정적 생성자를 생성하는 것이 좋습니다.