88

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

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

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

4

3 回答 3

83

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

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 ??
    }
}

并认为他可以减少行数。

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

于 2012-08-20T07:38:42.787 回答
15

是类似的问题和答案:

锁确保互斥——不能超过一个线程同时持有锁。锁用一个特定的对象实例来标识。您每次都在创建一个要锁定的新对象,并且您无法通知任何其他线程锁定该完全相同的对象实例。因此,您的锁定是无用的。

于 2012-08-20T07:39:29.697 回答
2

它可能是无用的。但它的存在可能会造成内存屏障。不确定 c# 是否会锁定省略,或者是否会保留锁定的排序语义。

于 2012-09-06T02:21:09.570 回答