Атомарность оператора объединения C #

Сегодня я наткнулся на какой-то одноэлементный код в нашей кодовой базе, и я не был уверен, что следующее является потокобезопасным:

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()); }
    }
}

Это все правильно?

7
задан Adam 23 February 2012 в 19:57
поделиться