Подожди - вопрос в названии определенно не является реальным вопросом, который задает Рори.
Титульный вопрос имеет простой ответ «Нет», но это совсем не помогает, когда вы видите реальный вопрос, на который, я думаю, никто не дал простого ответа.
Реальный вопрос, который задает Рори, представлен гораздо позже и более уместен в приведенном им примере.
Почему поле s_Initialized читается
вне замка?
Ответ на этот вопрос также прост, хотя и совершенно не связан с атомарностью доступа к переменным.
Поле s_Initialized читается вне блокировки, потому что блокировки стоят дорого .
Так как поле s_Initialized по сути является «однократной записью», оно никогда не вернет ложное срабатывание.
Экономно читать за пределами замка.
Это низкая стоимость активности с высокой вероятностью получения выгоды.
Вот почему он читается за пределами блокировки - чтобы не оплачивать стоимость использования блокировки, если это не указано.
Если бы блокировки были дешевыми, код был бы проще, и эту первую проверку пропустите.
(правка: следует хороший ответ от Рори. Да, логические чтения очень атомарные. Если кто-то построит процессор с неатомарными логическими чтениями, они будут представлены в DailyWTF.)