2011-03-26 7 views
1

나는 "글로벌"데이터를 유지하는 내 ASP MFC 응용 프로그램의 클래스가 있습니다. 그것은 싱글 톤으로 구현됩니다.C# asp mvc 싱글 톤 가비지 수집

lock (InfoStrings.GetMe()) 
{ 
... 
} 

좋아,이 질문 : :이처럼에 잠이 클래스에 액세스 컨트롤러의 코드에서 이제

class InfoStrings 
{ 
    public List<string> strings = new List<string>(); 
    static InfoStrings me = null; 

    private InfoStrings() 
    { } 
    public static InfoStrings GetMe() 
    { 
     if(me == null) 
      me = new InfoStrings(); 

     return me; 
    } 
} 

: 그것은 다음과 같이 보입니다 할 수있는, 이론적으로)

1 내 InfoStrings 개체가 가비지 수집됩니까?

2) 적절한 잠금을하고 있습니까?

답변

3

1) 이론적으로 내 InfoStrings 개체를 가비지 수집 할 수 있습니까?

아니요, 할당 된 정적 필드는 가비지 수집되지 않습니다.

2) 적절한 잠금을하고 있습니까?

난 당신이 개인 정적 객체에 잠금 추천 할 것입니다 : C#에서 싱글 톤 패턴을 구현할 때

private static object _syncRoot = new object(); 
... 
lock (_syncRoot) 
{ 
    var instance = InfoStrings.GetMe(); 
} 

당신은 또한 유용 following article을 찾을 수 있습니다. 예 :

public sealed class InfoStrings 
{ 
    private InfoStrings() 
    { 
    } 

    public static InfoStrings Instance 
    { 
     get { return Nested.instance; } 
    } 

    private class Nested 
    { 
     static Nested() 
     { 
     } 
     internal static readonly InfoStrings instance = new InfoStrings(); 
    } 
} 

다음 인스턴스 얻기 위해 잠글 필요가 없습니다 당신이에서 작업하는 경우

var instance = InfoStrings.Instance; 
1

을 찾을 수 있습니다 .NET 4.0을 사용하면이 작업을 수행 할 필요가 없습니다. Lazy 유형의 정적 읽기 전용 필드를 생성하고 LazyThreadSafetyMode.ExecutionAndPublication을 생성자에 전달 (인스턴스 작성 방법을 나타내는 Func과 함께)하여 값이 한 번만 생성되도록 보장 할 수 있습니다.

그런 다음 Lazy.Value 속성을 호출하는 속성을 노출하여 지연로드 된 단일 값을 반환합니다.

(텍스트는 singleton pattern in vb에서 복사 됨)