Почему объект блокировки должен быть статическим?

Очень часто используется закрытый статический объект readonly для блокировки в многопоточном потоке. Я понимаю, что частные уменьшают точки входа на объект блокировки, затягивая инкапсуляцию и, следовательно, доступ к наиболее существенным.

Но почему static?

private static readonly object Locker = new object();

В конце поле используется только в моем классе, и я мог бы просто использовать это вместо:

private readonly object Locker = new object();

Любые комментарии?

UPDATE:

В качестве примера я вставил этот код (просто пример). Я мог бы использовать статический или нестатический шкафчик на этом, и оба будут работать нормально. Учитывая нижеприведенный ответ, я должен скорее определить мой шкафчик таким образом? (Извините, у меня есть интервью на следующей неделе и вам нужно знать каждую деталь:)

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

Спасибо

Ответ 1

Не очень часто используется частный статический объект readonly для блокировки в многопоточном режиме - скорее, обычно используется блокировка при соответствующей/выбранной детализации. Иногда это static. Чаще всего, IMO, это не так, но основано на экземплярах.

В основное время вы видите блокировку static для глобального кэша или для отложенной загрузки глобальных данных/одиночных пакетов. И в последнем, есть лучшие способы сделать это в любом случае.

Итак, это действительно зависит: как Locker используется в вашем сценарии? Защищает ли она что-то, что само по себе статично? Если это так, замок должен быть статическим. Если он защищает то, что основано на экземпляре, тогда ИМО блокировка также должна быть основана на экземпляре.

Ответ 2

Он не обязательно должен быть статическим, на самом деле иногда он должен быть не статическим.

Переменная должна жить в том же объеме, что и методы, используемые для блокировки. Если методы являются статическими, переменная должна быть статической, и если методы являются методами экземпляра, переменная должна быть переменной экземпляра.

Статическая переменная будет по-прежнему работать, если она используется для блокировки в методе экземпляра, но тогда вы будете блокировать слишком много. Вы заблокируете все методы во всех экземплярах, а не только методы в одном экземпляре.

Ответ 3

Объем и время жизни блокировки могут/должны зависеть от "вещи", которую вы хотите заблокировать. Статические блокировки в основном используются для блокировки статических вещей.