Я все еще немного неясен, и когда нужно обернуть замок вокруг некоторого кода. Мое общее правило состоит в том, чтобы обернуть операцию в блокировку, когда она читает или записывает статическую переменную. Но когда статическая переменная ТОЛЬКО считывается (например, она только для чтения, которая задается при инициализации типа), доступ к ней не обязательно должен быть завернут в оператор блокировки, правильно? Недавно я увидел некоторый код, похожий на следующий пример, и это заставило меня подумать, что в моем многопоточном знании могут быть некоторые пробелы:
class Foo
{
private static readonly string bar = "O_o";
private bool TrySomething()
{
string bar;
lock(Foo.objectToLockOn)
{
bar = Foo.bar;
}
// Do something with bar
}
}
Это просто не имеет смысла для меня - почему бы там возникнуть проблема concurrency с READING регистром?
Кроме того, этот пример вызывает еще один вопрос. Один из них лучше, чем другой? (Например, пример два удерживает блокировку на меньшее время?) Полагаю, я мог бы разобрать 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;
}
}