为什么锁对象必须是静态的?
使用私有静态只读对象锁定多线程是非常常见的。 我明白私人通过收紧封装来减少锁定对象的入口点,因此可以访问最基本的内容。
但为什么静态?
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();
}
谢谢
使用私有静态只读对象来锁定多线程并不是很常见 - 相反,通常以适当的/选择的粒度使用锁。 有时候这是static
。 更常见的是,国际海事组织,它不是 - 但是基于实例。
您看到static
锁定的主要时间是全局缓存,或延迟加载全局数据/单例。 而在后者中,无论如何都有更好的方法。
所以这真的取决于: Locker
在你的场景中如何使用? 它保护的东西本身是静态的吗? 如果是这样,锁应该是静态的。 如果它保护的是基于实例的东西,那么IMO的锁应该也是基于实例的。
它不必是静态的,其实有时它不应该是一成不变的。
该变量应该与您使用它进行锁定的方法保持相同的范围。 如果方法是静态的,变量应该是静态的,如果方法是实例方法,变量应该是一个实例变量。
当用于锁定实例方法时,静态变量仍然可以工作,但是您将锁定太多。 您将锁定所有实例中的所有方法,而不仅仅是同一实例中的方法。
锁的范围和生命周期可以/应该取决于您要锁定的“事物”。 静态锁主要用于锁定静态事物。
链接地址: http://www.djcxy.com/p/21073.html