2

次のようなJavaシングルトンがある場合:

public class MySingleton {

private static MySingleton instance;

private int member;

public static MySingleton getInstance(){
    if(instance==null){
        instance = new MySingleton();
    }
    return instance;
}

private MySingleton(){
    //empty private constructor
}

public int getMemberA(){
    return member;
}

public int getMemberB(){
    return instance.member;
}

}

... getMemberAとgetMemberBに違いはありますか?instance.xxxつまり、とだけでメンバーにアクセスすることには違いがありxxxますか?

注:シングルトンパターンを使用することの長所と短所を認識しています。

4

4 に答える 4

10

はい、違いがあります。

シングルトン実装は現在スレッドセーフではありません。つまり、で参照されてgetMemberB()いるインスタンス以外instanceのインスタンスを呼び出すことができ、その時点で異なる結果が得られます。

実装がスレッドセーフである場合(つまり、実際には1つのインスタンスしか作成できなかった場合)、それらは同等であり、より単純な形式がはるかに好まれます。

于 2012-05-17T14:54:22.970 に答える
4

機能的な違いはありませんがgetMemberA()、目には簡単です。

シングルトンはスレッドセーフではないことに注意してください。2つのスレッドをgetInstance()同時に呼び出すと、2つのオブジェクトが作成される可能性があります。これが発生した場合、シングルトン契約は破られ、すべての賭けは無効になります。

于 2012-05-17T14:53:17.420 に答える
1

動作に違いはありませんが、より直感的に見えるので、「returnmember」または「returnthis.member」を使用したいと思います。

スレッドセーフは完全に異なるトピックであり、この単純なシングルトンはスレッドセーフなシングルトンの要件を満たしていません。

于 2012-05-17T14:56:39.653 に答える
0

シングルトンパターンの実装では、遅延読み込み手法を使用します。しかし、それはスレッドセーフではありません。synchronizedこのキーワードを使用してgetInstance()メソッドスレッドを安全にすることはできますが、パフォーマンスが低下します。プライベートシングルトンメンバーを再確認することをお勧めします。

public class MySingleton {

    private volatile static MySingleton instance;

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

    private MySingleton(){
        //empty private constructor
    }
}
于 2012-05-17T15:26:34.757 に答える