Потребность в энергозависимом модификаторе при двойной проверке блокировки в .NET
В нескольких текстах говорится, что при реализации двойной проверки блокировки в .NET к полю, к которому вы привязываетесь, должен применяться модификатор volatile. Но почему именно? Рассматривая следующий пример:
public sealed class Singleton
{
private static volatile Singleton instance;
private static object syncRoot = new Object();
private Singleton() {}
public static Singleton Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}
}
почему неlock (syncRoot) " достичь необходимой согласованности памяти? Isn»Правда ли, что после "замок" оператор чтения и записи будет изменчив, и поэтому будет достигнута необходимая последовательность?