0
public class ConnectionManager {

    private static Map <String, ConnectionManager> managerInstances = new HashMap<String, ConnectionManager>();

    private String dsKey;
    private ConnectionManager(String dsKey){
        this.dsKey = dsKey;
    }

    public static ConnectionManager getInstance(String dsKey){
        ConnectionManager managerInstance = managerInstances.get(dsKey);

        if (managerInstance == null) {
            synchronized (ConnectionManager.class) {
                managerInstance = managerInstances.get(dsKey);
                if (managerInstance == null) {
                    managerInstance = new ConnectionManager(dsKey);
                    managerInstances.put(dsKey, managerInstance);
                }
            }
        }
        return managerInstance;
    }
}

私は最近、GoF の本の定義に従って Singleton パターンが使用されていない場所でこのコードを見ました。シングルトンはMap独自のインスタンスを格納しています。

これはどのようなシングルトンと呼ぶことができますか? それとも、これはシングルトンの有効な使用法ですか?

4

2 に答える 2

9

シングルトンではありません。マルチトンパターンと呼ばれます。

マルチトン パターンでは、アプリケーションごとに 1つのインスタンスではなく、キーごとに 1 つのインスタンスが保証されます。

于 2013-08-08T06:26:35.097 に答える
4

そのマルチトンは、Java ではスレッドセーフではない二重チェックのロックイディオムを使用しているため、壊れているようです。特に、null 以外の文字列を使用して を呼び出すとgetInstance(s)、 nullでsある を指す非 null 参照を受け取る可能性があります。ConnectionManagerdsKey

代わりにスレッド セーフな ConcurrentHashMap を使用し、同期の必要性をなくす方がはるかに優れています。

于 2013-08-08T06:30:24.767 に答える