Очень часто используется частный статический объект только для чтения для блокировки в многопоточности. Я понимаю, что 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();
}
Спасибо
c#
multithreading
locking
Houman
источник
источник
_service
и где находятся_waithandle
? пример? статический? Другой? Это может быть , например, преднамеренная синхронизация доступа к удаленному серверу ...Ответы:
«Не очень распространено использование частного статического объекта, доступного только для чтения, для блокировки в многопоточности» - скорее, обычно используется блокировка с соответствующей / выбранной степенью детализации . Иногда так бывает
static
. Чаще, ИМО, это не так, но основано на экземплярах .В основном, вы видите
static
блокировку для глобального кеша или для отложенной загрузки глобальных данных / синглтонов. И в последнем случае, есть лучшие способы сделать это в любом случае .Так что все действительно зависит: как это
Locker
используется в вашем сценарии? Является ли она защищать то , что является само по себе статический? В таком случае блокировка должна быть статичной. Если он защищает что-то, что основано на экземпляре , то IMO блокировка также должна быть основана на экземпляре.источник
Он не обязательно должен быть статичным, на самом деле иногда он не должен быть статичным.
Переменная должна находиться в той же области видимости, что и методы, в которых вы ее используете для блокировки. Если методы являются статическими, переменная должна быть статической, а если методы являются методами экземпляра, переменная должна быть переменной экземпляра.
Статическая переменная по-прежнему будет работать при использовании для блокировки в методе экземпляра, но тогда вы будете блокировать слишком много. Вы заблокируете все методы во всех экземплярах, а не только методы в одном экземпляре.
источник
Объем и время жизни блокировки могут / должны зависеть от «объекта», который вы хотите заблокировать. Статические замки в основном используются для блокировки статических вещей.
источник