Поскольку ни один из написанного вами кода не изменяет статическое поле после инициализации, нет необходимости в какой-либо блокировке. Простая замена строки новым значением также не требует синхронизации, если только новое значение не зависит от результатов чтения старого значения.
Статические поля - не единственные объекты, требующие синхронизации, любая общая ссылка, которая может быть изменена, уязвима для проблем синхронизации.
class Foo
{
private int count = 0;
public void TrySomething()
{
count++;
}
}
Вы могли бы предположить, что два потока, выполняющие метод TrySomething, будут в порядке. Но это не так.
- Поток A считывает значение count (0) в регистр, чтобы его можно было увеличивать.
- Переключение контекста! Планировщик потока решает, что у потока A было достаточно времени выполнения. Следующая на очереди - тема B.
- Поток B считывает значение count (0) в регистр.
- Поток B увеличивает регистр.
- Поток B сохраняет результат (1) для подсчета.
- Переключение контекста обратно на A.
- Поток A перезагружает регистр со значением count (0), сохраненным в его стеке.
- Поток A увеличивает регистр.
- Нить A сохраняет результат (1) для подсчета.
Итак, хотя мы дважды вызывали count ++, значение count только что изменилось с 0 на 1. Позволяет сделать код безопасным для потоков:
class Foo
{
private int count = 0;
private readonly object sync = new object();
public void TrySomething()
{
lock(sync)
count++;
}
}
Теперь, когда поток A прерывается, поток B не может связываться со счетчиком, потому что он попадет в оператор блокировки и затем будет блокироваться, пока поток A не освободит синхронизацию.
Кстати, существует альтернативный способ сделать потоковые Int32s и Int64s поточно-безопасными:
class Foo
{
private int count = 0;
public void TrySomething()
{
System.Threading.Interlocked.Increment(ref count);
}
}
Что касается второй части вашего вопроса, я думаю, что я просто остановлюсь на том, что легче читать, любая разница в производительности будет незначительной. Ранняя оптимизация - корень всего зла и т. Д.
Почему многопоточность трудна