2017-02-09 2 views
0

개체 목록이있는 단일 클래스가 있습니다. 그래서 그 목록에 항목을 설정하는 클래스가 있습니다. 그런 다음, 그 싱글 톤 클래스에서 객체의 목록을 가져 오는 다른 클래스가 있습니다. 내 문제는 nservicebus 메시지를 받고 싱글 톤 클래스에서 목록을 가져올 때 목록에 개체가 들어 있지 않은 경우입니다. 그리고 그 대상이 존재할 때가 있습니다. 그래서, 내가 한 것은 싱글 톤 인스턴스를 얻을 때마다 'GetHashCode'를 실행하고 Singleton 클래스의 두 가지 인스턴스가 있음을 확인하는 것입니다. 내 코드로 무엇을 잘못 구현 했습니까? WebApplication에는 2 개의 Singleton 클래스 인스턴스가 있습니다.

public class SingletonClass 
{ 
    private static readonly object _lockObj = new object(); 
    private static readonly object _lockObjList = new object(); 

    static SingletonClass _singletonClass; 

    private static List<object> _objList; 


    private SingletonClass() 
    { 

    } 

    public static SingletonClass Instance 
    { 
     get 
     { 
      lock(_lockObj) 
      { 
       if (null == _singletonClass) 
       { 
        _singletonClass= new SingletonClass(); 
        _objList = new List<object>(); 
       } 
       return _singletonClass; 
      } 
     } 
    } 

    public List<obj> GetList() 
    { 
     lock(_lockObjList) 
     { 
      return _objList; 
     } 
    } 

    public void UpdateProgress(int index, double value) 
    { 
     lock(_lockObjList) 
     { 
      _objList[index].Progress = value; 
     } 
    } 


    public void SetList(List<obj> objs) 
    { 
     lock(_lockObjList) 
     { 
      _objList = objs; 
     } 
    } 
} 
public class MessageHandler : HubInvoker<MessageHub> 
{ 

    public MessageHandler() {} 

    public void OnReceiveMessage(object sender, MessageArgs args) 
    { 
     var list = SingletonClass.Instance.GetList(); 
     if(list != null){ 
      var i = 0; 
      for(; i < list.Length && list[i].Id == args.Id; i++); 

      if(i < list.Length) 
      { 
       SingletonClass.Instance.UpdateProgress(i, args.Progress); 
      } 
     } 
    } 
} 
public class ObjController 
{ 
    public ObjController() {} 

    public void SetList(List<obj> objs) 
    { 
     SingletonClass.Instance.SetList(objs); 
    } 
} 

내가 내 구현에 대한 자세한 내용은 몇 가지 코드 위에 추가 한

을 편집했다.

+0

아마'Lazy '접근 방식으로 갈 것입니다. 클래스를 싱글 톤 클래스로 만들지 말고 그냥 정적 Lazy 필드에 저장하십시오. –

+0

어쨌든이리스트가 정적 싱글 톤이 필요한 이유는 무엇입니까? –

+0

@CallumLinington 목록이 응용 프로그램에서 비동기 적으로 수정됩니다. 여러 클래스가 목록에 액세스하여 수정합니다. – chary

답변

0

더블 체크 잠금을 구현해야합니다 (here 참조). 설정에 따라 휘발성 키워드도 달라집니다. 아래 코드를 참조하십시오 :

public static SingletonClass Instance 
{ 
    get 
    { 
     if (null == _singletonClass) 
     { 
      lock (_lockObj) 
      { 
       if (null == _singletonClass) 
       { 
        _singletonClass = new SingletonClass(); 
        _objList = new List<object>(); 
       } 
       return _singletonClass; 
      } 
     } 
    } 
} 
+0

이중 잠금 접근법을 시도했지만 여전히 2 개의 다른 인스턴스가 있습니다 – chary

+0

윌 [this 기사] (https://docs.particular.net/nservicebus/containers/#dependency-lifecycle-singleinstance) 도움이 필요하십니까? –

관련 문제