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

同様の質問と回答があります

ロックは相互排除を保証します-同時にロックを保持できるスレッドは1つだけです。ロックは特定のオブジェクトインスタンスで識別されます。毎回ロックする新しいオブジェクトを作成していて、まったく同じオブジェクトインスタンスをロックするように他のスレッドに通知する方法がありません。したがって、ロックは役に立ちません。

于 2012-08-20T07:39:29.697 に答える
2

おそらく役に立たないでしょう。しかし、メモリバリアを作成する可能性はほとんどありません。c#がロックの省略を行うのか、それともロックの順序付けのセマンティクスを保持するのかはわかりません。

于 2012-09-06T02:21:09.570 に答える