Почему эта блокировка с двойной проверкой является правильной? (.NET)

Я много читал об опасностях двойной проверки замков, и я бы очень старался держаться от них подальше, но, несмотря на это, я думаю, что они представляют собой очень интересное чтение.

Я читал эту статью Джо Даффи о реализации синглтона с двойной проверкой блокировки: 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.

7
задан ryaner 20 December 2013 в 17:47
поделиться