[c#] 잠금 개체가 정적이어야하는 이유는 무엇입니까?

다중 스레딩에서 잠금을 위해 개인 정적 읽기 전용 개체를 사용하는 것은 매우 일반적입니다. 개인은 캡슐화를 조여 잠금 개체에 대한 진입 점을 줄이고 따라서 가장 필수적인 항목에 액세스 할 수 있음을 이해합니다.

하지만 왜 정적일까요?

private static readonly object Locker = new object();

마지막에 필드는 내 클래스 내에서만 사용되며 대신 이것을 사용할 수도 있습니다.

private readonly object Locker = new object();

다른하실 말씀 있나요?

최신 정보:

예를 들어이 코드를 붙여 넣었습니다 (예제). 나는 이것에 정적 또는 비 정적 사물함을 사용할 수 있으며 둘 다 잘 작동합니다. 아래의 답변을 고려할 때 내 사물함을 이와 같이 정의해야합니까? (미안하지만 다음 주에 인터뷰가 있고 모든 세부 사항을 알아야합니다. 🙂

private readonly object Locker = new object();

다음은 코드입니다.

    private int _priceA;
    private int _priceB;
    private EventWaitHandle[] _waithandle;
    private readonly IService _service;

//ctor
public ModuleAViewModel(IService service)
    {
        _service = service;
        _modelA = new ModelA();
        _waithandle = new ManualResetEvent[2];
        _waithandle[0] = new ManualResetEvent(false);
        _waithandle[1] = new ManualResetEvent(false);
        LoadDataByThread();
    }


 private void LoadDataByThread()
        {
            new Thread(() =>
                           {
                               new Thread(() =>
                               {
                                   lock (Locker)
                                   {
                                       _priceA = _service.GetPriceA();
                                   }
                                   _waithandle[0].Set();
                               }).Start();

                               new Thread(() =>
                               {
                                   lock (Locker)
                                   {
                                       _priceB = _service.GetPriceB();
                                   }
                                   _waithandle[1].Set();
                               }).Start();

                               WaitHandle.WaitAll(_waithandle);
                               PriceA = _priceA;
                               PriceB = _priceB;
                           }).Start();
        }

감사



답변

“다중 스레딩에서 잠금을 위해 개인 정적 읽기 전용 개체를 사용하는 것이 매우 일반적”이 아니라 적절한 / 선택된 세분성에서 잠금을 사용하는 것이 일반적 입니다. 때때로 그것은 static. 더 자주, IMO는 그렇지 않지만 인스턴스 기반입니다.

static잠금이 표시되는 주요 시간 은 글로벌 캐시 또는 글로벌 데이터 / 싱글 톤의 지연된로드입니다. 그리고 후자의 경우 어쨌든 더 나은 방법이 있습니다.

그래서 그것은 정말로 다릅니다 : Locker당신의 시나리오에서 어떻게 사용됩니까? 자체적으로 정적 인 것을 보호하고 있습니까? 그렇다면 잠금은 정적이어야합니다. 인스턴스 기반을 보호하는 경우 IMO 잠금 인스턴스 기반이어야합니다.


답변

정적 일 필요는 없습니다 . 사실 때로는 정적 일 필요가 없습니다 .

변수는 잠금에 사용하는 메서드와 동일한 범위에 있어야합니다. 메서드가 정적이면 변수는 정적이어야하고 메서드가 인스턴스 메서드이면 변수는 인스턴스 변수 여야합니다.

인스턴스 메서드에서 잠그는 데 사용되는 정적 변수는 계속 작동하지만 너무 많이 잠 깁니다. 동일한 인스턴스의 메서드뿐만 아니라 모든 인스턴스의 모든 메서드를 잠급니다.


답변

잠금의 범위와 수명은 잠 그려는 ‘물건’에 따라 달라집니다. 정적 잠금은 주로 정적 사물을 잠그는 데 사용됩니다.


답변