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


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

но почему статические?

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

спасибо

3 92

3 ответа:

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

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

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

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

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

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

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