为什么locking对象必须是静态的?
使用私有静态只读对象lockingmultithreading是非常常见的。 我明白,私人通过收紧封装来降低locking对象的入口点,从而获得最重要的。
但是为什么静态?
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(); }
谢谢
使用私有静态只读对象来lockingmultithreading并不是很常见 – 相反, 在适当的/select的粒度上使用锁是很常见的。 有时候这是static
。 更经常的是,国际海事组织,它不是 – 但是以实例为基础。
您看到static
locking的主要时间是全局caching,或延迟加载全局数据/单例。 而在后者, 反正有更好的方法去做。
所以这真的取决于: Locker
在你的情况下如何使用? 它是保护本身是静态的东西吗? 如果是这样,锁应该是静态的。 如果它保护的是基于实例的东西,那么IMO的锁也应该是基于实例的。
它不一定是静态的,事实上有时它不应该是静态的。
该variables应该与您使用它进行locking的方法保持相同的范围。 如果方法是静态的,variables应该是静态的,如果方法是实例方法,variables应该是一个实例variables。
当用于locking实例方法时,静态variables仍然可以工作,但是您将会locking太多。 您将locking所有实例中的所有方法,而不仅仅是同一实例中的方法。
锁的范围和生命周期可以/应该取决于你想要locking的“事物”。 静态锁主要用于locking静态事物。