Во многих текстах говорится, что при реализации блокировки с двойной проверкой в .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)» не обеспечивает необходимую согласованность памяти? Разве не правда, что после оператора блокировки и чтение, и запись будут нестабильными, и поэтому будет достигнута необходимая согласованность?
Подробнее здесь:
https://stackoverflow.com/questions/196 ... ing-in-net