C# lock(新对象())--Cargo cult或其他疯狂的东西;语言特例;?

C# lock(新对象())--Cargo cult或其他疯狂的东西;语言特例;?,c#,thread-safety,locking,C#,Thread Safety,Locking,我正在审阅一位顾问编写的一些代码,虽然已经出现了几十个危险信号,但我无法理解以下代码片段: private void foo() { if (InvokeRequired) { lock (new object()) { if (m_bar!= null) Invoke(new fooDelegate(foo), new object[] { }); } } e

我正在审阅一位顾问编写的一些代码,虽然已经出现了几十个危险信号,但我无法理解以下代码片段:

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

锁(新对象())在这里做什么?应该没有任何效果,因为它总是锁定在另一个对象上,但这种锁定在整个代码中都是持久的,即使在非复制和粘贴的部分也是如此。这是C语言中的一种特殊情况,它被编译成了我不知道的东西,还是程序员只是采用了一些不久前还可以使用的cargo cult?

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

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 ??
    }
}
他认为他可以减少台词的数量

如果真是这样的话,我会非常担心,不过…

是类似的问题,答案是:

锁确保了互斥性——最多只能有一个线程可以容纳 同时锁定。锁由特定对象标识 例如。您正在创建一个新对象以在每次 没有任何方法可以通知任何其他线程来锁定这个确切的线程 相同的对象实例。因此,您的锁定是无用的


这可能没用。但它很可能会造成记忆障碍。不确定c#是否进行了锁省略,或者是否保留了锁的顺序语义。

我认为他们非常困惑。他们可能在
newobject()
存储在字段中的地方看到了它,而该字段被用在
lock()
语句中,他们不知道最好不要内联它。那个“顾问”有一些解释要做。。。你没有错:
lock
code完全是错误的useless@Baboon:只有在你不是必须进行重构的人的情况下……另外,如果这是WinForms,那么我不明白为什么那里应该有一个锁。删除它,然后重新运行你的100%代码覆盖率测试套件。那是什么?以前的顾问没有做过?他可能看到一个名为“newObject()”的方法,这个方法返回了一个单例实例,但他说“嘿,c#没有关键字吗?”这听起来确实像是一个重构工作,但没有有效地理解正在进行的工作。@OrangeDog:遗憾的是,这是不可能的,因为相关的代码是在我加入公司之前编写的。现在有了更改,也许我可以说服管理层让我修复代码。否则,我将不对任何不稳定现象负责(最后一个接触任何东西的人是罪魁祸首)。@Ibruder更重要的任务是说服管理层他们需要版本控制、自动化测试和审查系统。如果最后一个触碰任何东西的人是罪魁祸首,那么这听起来不像是一家很好的公司。我不太在乎明显的锁被破坏——其他人都已经指出了这一点,但是+1只是为了“或iOS 4/5之前的程序”,这是几年前的事,但是伙计,你完全应该得到+1,因为你说出了一些人完全忽视的明显事实。例如,在通用Windows平台上没有MemoryBarrier()方法,而Interlocked.CompareExchange和lock(new Object())成为处理某些问题的唯一方法。我甚至不知道C允许这样做。你能指出这一点真是太好了。