[c#] 왜 잠금 객체는 정적이어야합니까?


0 Answers

실제로 정적 일 필요는 없습니다 . 실제로는 정적이어서는 안됩니다 .

변수는 잠금에 사용하는 메소드와 동일한 범위에 있어야합니다. 메소드가 정적 인 경우 변수는 정적이어야하며 메소드가 인스턴스 메소드 인 경우 변수는 인스턴스가 가변적이어야합니다.

정적 변수는 인스턴스 메소드를 잠그기 위해 사용될 때도 작동하지만 너무 많이 잠글 수 있습니다. 동일한 인스턴스의 메소드뿐만 아니라 모든 인스턴스의 모든 메소드를 잠글 것입니다.

Question

멀티 스레딩에서 잠금을 위해 전용 정적 읽기 전용 객체를 사용하는 것은 매우 일반적입니다. 개인적으로는 캡슐화를 강화하여 잠금 개체의 진입 점을 줄여서 가장 필수적인 요소에 액세스 할 수 있다고 생각합니다.

하지만 왜 정적입니까?

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();
        }

감사






Related