为什么锁对象必须是静态的?

在多线程中使用私有静态只读对象锁定是非常常见的。 我理解 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();
}

谢谢

82383 次浏览

“在多线程中使用私有静态只读对象进行锁定并不常见”——相反,使用锁 以适当的/选择的粒度是常见的。有时候这就是 static。更常见的是,IMO,它不是——但是是基于 例子的。

您看到 static锁的主要时间是用于全局缓存或全局数据/单例的延迟加载。在后者中,有更好的方法来实现 无论如何

因此,这实际上取决于: 在您的场景中如何使用 Locker?它是否在保护某些 本身静态的东西?如果是这样,锁应该是静态的。如果它是保护基于 例子的东西,那么 IMO 的锁应该是基于实例的 还有

锁的作用域和生存期可以/应该取决于您想要锁定的“对象”。 静态锁主要用于锁定静态事物。

它不一定是静态的,事实上有时它应该 没有是静态的。

变量应该与用于锁定的方法位于同一范围内。如果方法是静态的,那么变量应该是静态的,如果方法是实例方法,那么变量应该是实例变量。

静态变量在用于锁定实例方法时仍然可以工作,但那样就会锁定过多。您将锁定所有实例中的所有方法,而不仅仅是同一实例中的方法。