lock(new object()) - Cargo cult还是一些疯狂的"语言特例"?

86 c# locking thread-safety

我正在审查一些顾问编写的代码,虽然已经弹出了数十个红旗,但我无法围绕以下片段进行讨论:

private void foo()
{
    if (InvokeRequired)
    {
        lock (new object())
        {
            if (m_bar!= null)
                Invoke(new fooDelegate(foo), new object[] { });
        }
    }
    else
    {
        if(OnBazChanged != null)
            OnBazChanged();
    }
}
Run Code Online (Sandbox Code Playgroud)

什么是锁(新对象())在这做什么?应该没有任何影响,因为它始终锁定在另一个对象上,但这种锁定在整个代码中都是持久的,即使在非复制粘贴的部分也是如此.这是C#语言中的一些特殊情况,编译成我不知道的东西,还是程序员只是采用了一些恰好在前一段时间工作的货物崇拜?

cjk*_*cjk 82

如果有人看到这个,我不会感到惊讶:

private readonly object lockObj = new object();

private void MyMethod()
{
    lock(lockObj)
    {
        // do amazing stuff, so amazing it can only run once at a time
        // e.g. comands on the Mars Rover, or programs on iOS pre 4 / 5 ??
    }
}
Run Code Online (Sandbox Code Playgroud)

并认为他可以削减线数.

如果情况确实如此,我会非常担心......

  • 它确实听起来像一个重构工作,没有有效地理解正在发生的事情. (9认同)
  • 他可能会看到一个名为"newObject()"的方法,并且这个方法返回了一个单例实例,但他说"嘿,c#不具有关键字"吗? (4认同)
  • @Ibruder更高优先级是说服管理层他们需要版本控制,自动化测试和审查系统.如果最后一个接触任何东西是应该责备的,那么它听起来不是一个非常好的公司. (2认同)

Jle*_*HeP 15

是类似的问题,并回答:

锁定确保互斥 - 只有一个线程可以同时保持锁定.锁定用特定的对象实例标识.您正在创建一个新对象以便每次都锁定,并且您无法通知任何其他线程锁定该完全相同的对象实例.因此,你的锁定是没用的.