В нескольких текстах сказано, что при реализации блокировки с двойным проверкой в .NET в поле, в котором вы блокируетесь, должен применяться изменчивый модификатор. Но почему именно? Рассмотрим следующий пример:
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)" не выполняет необходимую последовательность памяти? Не правда ли, что после слова "блокировка" как чтение, так и запись были бы неустойчивыми, и поэтому была бы обеспечена необходимая согласованность?