0

複数のスレッドがこのクラスの単一のインスタンスを取得できるように、次のシングルトン クラスの obj1 と obj2 のみを同期する必要がありますが、一度に 1 つのスレッドのみが obj1 または obj2 にアクセスできます。

  public class Sample{

    private static LinkedHashMap<String, String> obj1;
    private static LinkedHashMap<String, String> obj2;

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

    private Sample() {

    }

    public void add(LinkedHashMap lhm){
        //steps
        }

    public void remove(LinkedHashMap lhm){
        //steps
        }

}

どうすればいいですか?

4

1 に答える 1

4

まず、2 つの変数を静的変数ではなくインスタンス変数にします。

次に、シングルトンのメソッドを同期します。

public synchronized void add(LinkedHashMap lhm){
    //steps
}

シングルトンの怠惰なインスタンス化は避けます。ほとんどの場合、付加価値はありません。

private static final Sample INSTANCE = new Sample();

public static Sample getInstance() {
    return INSTANCE;
}

本当に遅延初期化を維持したい場合は、getInstance()メソッドも同期する必要があります。また、2 つのスレッドがシングルトンの 2 つの異なるインスタンスを取得する可能性があります。

于 2013-02-04T07:46:55.503 に答える