Почему объект блокировки должен быть статическим?
очень часто используется частный статический объект 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 ответа:
это не "очень часто использовать частный статический объект только для чтения для блокировки в многопоточности" - скорее, это часто использовать блокировку при соответствующей / выбранной детализации. Иногда это
static
. Чаще всего, ИМО, это не так-но это экземпляр на основе.основное время вы видите
static
блокировка предназначена для глобального кэша или для отложенной загрузки глобальных данных / синглетов. И в последнем, есть лучшие способы сделать это в любом случае.Так что это действительно зависит от того, как
Locker
использовать в вашем сценарии? Он защищает то, что статический? Если это так, то замок должен быть статическим. Если он защищает что-то, что экземпляр на основе, то ИМО замок должен и быть экземпляр на основе.
Он не должен быть статичным, на самом деле иногда он должен не быть статичным.
переменная должна находиться в той же области, что и методы, в которых она используется для блокировки. Если методы являются статическими, переменная должна быть статической, а если методы являются методами экземпляра, переменная должна быть переменной экземпляра.
статическая переменная будет по-прежнему работать при использовании для блокировки в метод экземпляра, но тогда вы будете фиксировать слишком много. Вы будете блокировать все методы во всех экземплярах, а не только методы в одном экземпляре.