7

ロックと正確に何が起こるかについて、職場で話し合いました。この議論のきっかけとなったコードは次のとおりです。

        string name = (string)context.Cache[key];

        if (String.IsNullOrEmpty(name)){

            lock (typeof(string)){
                name = (string)context.Cache[key];
                //.. other code to get the name and then store in the cache
            }
        }

コードが名前を取得してキャッシュに保存している間、他に何も中断しないように、キャッシュ内の値を探し、そこにない場合はロックを取得します。

私たちの議論は、(typeof(string)) が物事を行うための最良の方法であるかどうか、および正確には何が最善であるかに焦点を当てました。

私の質問は、 lock(typeof(string)) が正確に何をするのですか? ロックに使用されるローカル文字列を作成しますか、それともより広い範囲で何かを作成するため、安全ではない可能性があります。

MSDN ロック ステートメント

4

3 に答える 3

8

私の質問は、 lock(typeof(string)) が正確に何をするのですか?

オペレーターが返すType参照によって参照されるオブジェクトをロックします。typeof

つまり、同じプロセス (または少なくとも同じ AppDomain) 内のどこかで同じことを行うコードは、同じロックを共有します。私には悪い考えのように聞こえます。

ロックオンのためだけにオブジェクトを作成することをお勧めします。

private static readonly object CacheLock = new object();

...

lock (CacheLock)
{
    ...
}

そうすれば、そのオブジェクトに何がロックされるかを簡単に確認できます。

于 2013-10-30T15:45:48.977 に答える
2

をロックするTypeと、 のそのインスタンスに基づいて相互アクセスが除外されていることを意味しますType。これは、アプリケーション内の 2 つのスレッドがこれを実行すると、不注意で互いにブロックしたり、予期しないデッドロックを引き起こしたりすることを意味します。

インスタンスtypeof(someType)を返すだけであることを忘れないでください。Type

通常、readonly objectクラスで を宣言するなど、オブジェクトを複雑なプロセスのロック専用にすることをお勧めします。ロックがコレクションなどのプライベート変数へのアクセスを回避する必要がある場合は、そのコレクションをロックするだけで十分です。

于 2013-10-30T15:45:29.140 に答える
1

リンク先のページに示されているように:

一般に、パブリック型、またはコードの制御を超えたインスタンスのロックは避けてください。一般的な構成要素 lock (this)、lock (typeof (MyType))、および lock ("myLock") は、次のガイドラインに違反しています。

lock (typeof (MyType))パブリックにアクセスできる場合は問題ですMyType

于 2013-10-30T15:45:46.580 に答える