Я много читал об опасностях двойной проверки замков, и я бы очень старался держаться от них подальше, но, несмотря на это, я думаю, что они представляют собой очень интересное чтение.
Я читал эту статью Джо Даффи о реализации синглтона с двойной проверкой блокировки: http://www.bluebytesoftware.com/blog/PermaLink,guid,543d89ad-8d57-4a51-b7c9-a821e3992bf6.aspx
И (вариант) решения, которое он предложил, выглядит так:
class Singleton {
private static object slock = new object();
private static Singleton instance;
private static int initialized;
private Singleton() {}
public Instance {
get {
if (Thread.VolatileRead(ref initialized) == 0) {
lock (slock) {
if (initialized == 0) {
instance = new Singleton();
initialized = 1;
}
}
}
return instance;
}
}
}
Мой вопрос в том, нет ли в этом случае опасности того, что записи будут переупорядочены? В частности, эти две строки:
instance = new Singleton();
initialized = 1;
Если эти записи инвертированы, то какой-то другой поток все равно может прочитать null.