使用私有静态只读对象进行多线程锁定非常普遍。我了解到,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();
}
谢谢
15
据我所知,静态通常用于使其与实例无关。如果存在多个“ MyWorkerClass”实例,则一次只能运行一个给定的数据(假设它们都使用共享资源)。
—
布拉德·克里斯蒂
该编辑缺少一个重要的细节:位置
—
Marc Gravell
_service
和_waithandle
位置?实例?静态的?其他?例如,这可能是故意同步对远程服务器的访问...
正确,进行第二次编辑:是的,从这件事开始,您可以按实例锁定。但是,可能有使其保持静态的原因-如果原始开发人员想要(如上所述)同步访问权限,以便服务器一次仅从此AppDomain收到一个请求...我不知道是否是这种情况,或者是否只是偶然的。
—
马克·格雷韦尔