単一のパターンによる血液検査


今日の午后、面接に行きました.1时间半も会って、最后に面接官は、コードを书いてください.いろいろな文法に注意してください.効率を考えてください.blabla...単例モードを書いてください.
そして書き始めました...
そして次のコードを面接官に書いて、マルチスレッドロックのコードが具体的に何なのか忘れてしまったと言いました...
class Singleton {
private:
	static Singleton * volatile pInstance;
	Singleton(){}
public:
	Singleton* instance() {
		if (pInstance == 0) {
			Lock
			{
				if (pInstance == 0) {
					pInstance = new Singleton;
				}
			}
		}
		return pInstance;
	}
};

面接官はしばらく見て、うん、そうしましょう.の
そしてもうすぐ終わるのに、面接官が突然また来た.あなたのコードはまだ最適化されていませんか.
あるって!(本を読むときstaticオブジェクトはクラスインスタンスが必要なときに作成できることをかすかに覚えているからです.)
どこだ?
staticで!
面接官は一目見て、それから、サプライズの顔をして、あなたのプログラムには大きなバグがあります!bug!bug!!!!ここにstaticが1つ足りなくてblablabla...
しかし、面接官の分析は正しい..
面接官はまた、私は他の人にこの問題を出して、すべてできないと言って、あなただけが書いて、しかし大きなバグがあります!
HRを探しに行きなさい.
そしてHRは、帰ってもいいと言った...
これは1例のモードが引き起こしたofferを失った血案で、具体的にはstaticがofferを失った血案です!
紛失したstaticはこちら:static Singleton*instance(){
class Singleton {
private:
	static Singleton * volatile pInstance;
	Singleton(){}
public:
	static Singleton* instance() {
		if (pInstance == 0) {
			Lock
			{
				if (pInstance == 0) {
					pInstance = new Singleton;
				}
			}
		}
		return pInstance;
	}
 };

他の単例モードのコードは一般的にJAVAで書かれています.
public class Singleton {
    private static Singleton single;    //            
    private Singleton() {}   //      

    public static Singleton getSingle() {   //             
        if (single == null) {
            synchronized (Singleton.class) {   //                      
                if (single == null) {
                    single = new Singleton();
                }
            }
        }
        return single;   //        
    }
}

これらのコードはダブルロックDouble-checked locking patternです