繁体   English   中英

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

[英]Why does the lock object have to be static?

在多线程中使用私有静态只读对象进行锁定是很常见的。 我知道私有通过收紧封装减少了锁定对象的入口点,因此可以访问最重要的部分。

但为什么是静态的?

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的。 更常见的是,IMO 不是——而是基于实例的。

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

所以这真的取决于: Locker在你的场景中是如何使用的? 它是在保护本身是静态的东西吗? 如果是这样,锁应该是静态的。 如果它正在保护基于实例的东西,那么 IMO 锁应该是基于实例的。

它不必是静态的,实际上有时它应该是静态的。

该变量应与您使用它进行锁定的方法位于同一范围内。 如果方法是静态的,则变量应该是静态的,如果方法是实例方法,则变量应该是实例变量。

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

锁的范围和生命周期可以/应该取决于您要锁定的“事物”。 静态锁主要用于锁定静态的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM