首页 文章

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

提问于
浏览
96

使用私有静态只读对象来锁定多线程是很常见的 . 我知道私有通过收紧封装来减少锁定对象的入口点,因此可以访问最重要的内容 .

但为什么静止?

private static readonly object Locker = new object();

最后,该字段仅在我的 class 中使用,我也可以使用它:

private readonly object Locker = new object();

任何意见?

UPDATE:

作为一个例子,我粘贴了这段代码(只是一个例子) . 我可以使用静态或非静态锁定器,两者都可以正常工作 . 考虑到下面的答案,我应该更喜欢这样定义我的储物柜? (对不起,我下周接受采访,需要知道每一个细节:)

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();
        }

谢谢

3 回答

  • 159

    它不是"very common to use a private static readonly object for locking in multi threading" - 相反,通常使用锁 at the appropriate / chosen granularity . 有时那是 static . 更常见的是,IMO,它不是 - 但是基于实例 .

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

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

  • 25

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

    变量应与您用于锁定的方法位于相同的范围内 . 如果方法是静态的,则变量应该是静态的,如果方法是实例方法,则变量应该是实例变量 .

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

  • 72

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

相关问题