2010-08-17 4 views
3

다중 스레드 프로그램에서 초기화를 한 번 수행하기위한 스 니펫은 "안전"합니까?다중 스레드 C# 프로그램에서 한 번 초기화 수행

나는 ... 좀 그 권투/언 박싱 몇 가지 문제가 발생할 수 있습니다 걱정 해요 난 그냥 홈페이지 또는 다른 단일 스레드 컨텍스트에서 초기화 할 수 없습니다

private static object initialized = false; 

public static void Initialize() 
{ 
    lock (initialized) 
    { 
    if ((bool)initialized == false) 
    { 
     DoInitialization(); 
     initialized = true; 
    } 
    } 
} 

참고.

답변

4

맞습니다. 잠금하려는 개체를 다시 할당하기 때문에 작동하지 않습니다.

두 개의 분리 된 멤버 (한 번만 할당되는 개체)와 한 번만 할당되거나 (잠긴 후에) 할당 할 수있는 부울로 분리 할 수 ​​있습니다.

singleton이 여기에 적합한 지 고려해 볼 수 있습니다.

+1

정적 생성자를 사용하십시오. 또는 새로운'Lazy '개체. –

1

몇 가지 옵션 : 마크가 언급 한 것처럼 한 번에 할당 된 참조 형에

  1. 잠금.
  2. 한 번만 실행되도록 보장되는 정적 생성자에서 초기화합니다. 단점 : 초기화가 필요할 때 제어하기가 어렵습니다.
  3. 가능한 경우 Lazy 클래스는 스레드로부터 안전합니다.

세 가지 방법 모두 싱글 톤을 만드는 데에도 사용할 수 있습니다.

3

보십시오 double-checked locking.

private static volatile bool initialized = false; 
    private static object syncObject = new object(); 
    public static void Initialize() { 
     if (!initialized) { 
      lock (syncObject) { 
       if (!initialized) { 
        DoInitialization(); 
        initialized = true; 
       } 
      } 
     } 
    } 
관련 문제