Почему объект блокировки должен быть статическим?
Очень часто используется закрытый статический объект 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
Объем и время жизни блокировки могут/должны зависеть от "вещи", которую вы хотите заблокировать.
Статические блокировки в основном используются для блокировки статических вещей.