単例モードで単例を取得する際に単例が2回空いているか否かを判断する問題

779 ワード

シングル・インスタンス・モードを使用して、シングル・インスタンスを取得する場合、次のような書き方がよく見られます.
public class Factory {

    private volatile static Factory sInstance = null;

    public static Factory getInstance() {
        if (sInstance == null) {
            synchronized (Factory.class) {
                if (sInstance == null) {
                    sInstance = new Factory();
                }
            }
        }
        return sInstance;
    }
}

なぜなら、マルチスレッドが同時発生するときに余分なインスタンスを作成しないようにするためです.最初にsInstanceが空であるか否かを判断するのは、返されるインスタンスが空でないことを確保するためであり、2回目にsInstanceが空であるか否かを判断するのは、余分なインスタンスegの作成を防止するためである.1つのスレッドがまだインスタンスを作成している場合、2番目のスレッドは、単一のスレッドを取得してsInstanceを判断し、空待機し、空ではないと判断し、作成しないと判断し、前の作成したインスタンスを返します.2回目の判断がなければ、1番目のスレッドがリリースロックを作成したときに2番目のスレッドがロックを取得し、インスタンスが再作成されます.