私はまだ少し不明確で、コードをいつロックするかはわかりません。私の一般的な経験則は、静的変数の読み取りまたは書き込み時に操作をロックでラップすることです。しかし、静的変数が読み取り専用の場合 (たとえば、型の初期化中に設定された読み取り専用の場合)、それにアクセスするために lock ステートメントでラップする必要はありませんよね? 最近、次の例のようなコードをいくつか見たので、マルチスレッドに関する知識にギャップがあるのではないかと思いました。
class Foo
{
private static readonly string bar = "O_o";
private bool TrySomething()
{
string bar;
lock(Foo.objectToLockOn)
{
bar = Foo.bar;
}
// Do something with bar
}
}
それは私には意味がありません.なぜレジスタの読み取りに並行性の問題があるのでしょうか?
また、この例は別の問題を提起します。これらのうちの1つは他のものより優れていますか? (たとえば、例 2 では、ロックを保持する時間が短くなりますか?) MSIL を逆アセンブルできると思います...
class Foo
{
private static string joke = "yo momma";
private string GetJoke()
{
lock(Foo.objectToLockOn)
{
return Foo.joke;
}
}
}
対。
class Foo
{
private static string joke = "yo momma";
private string GetJoke()
{
string joke;
lock(Foo.objectToLockOn)
{
joke = Foo.joke;
}
return joke;
}
}