Сегодня я наткнулся на какой-то одноэлементный код в нашей кодовой базе, и я не был уверен, что следующее является потокобезопасным:
public static IContentStructure Sentence{
get {
return _sentence ?? (_sentence = new Sentence());
}
}
Это утверждение эквивалентно:
if (_sentence != null) {
return _sentence;
}
else {
return (_sentence = new Sentence());
}
Я считаю, что ?? это просто уловка компилятора, и результирующий код по-прежнему НЕ является атомарным. Другими словами, два или более потока могут обнаружить, что _sentence имеет значение null, прежде чем устанавливать _sentence для нового предложения и возвращать его.
Чтобы гарантировать атомарность, мы должны необходимо заблокировать этот бит кода:
public static IContentStructure Sentence{
get {
lock (_sentence) { return _sentence ?? (_sentence = new Sentence()); }
}
}
Это все правильно?