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它自己的实例。

这可以称为什么样的单例?或者这是对 Singleton 的有效使用?

4

2 回答 2

9

这不是单例。它被称为多点模式

multiton 模式不是每个应用程序有一个实例,而是确保每个键有一个实例。

于 2013-08-08T06:26:35.097 回答
4

该 multiton 似乎已损坏,因为它使用了双重检查锁定习惯用法,这在 Java 中不是线程安全的。特别是,当getInstance(s)使用s非空字符串调用 时,您可能会收到指向为空的 a 的非空ConnectionManager引用dsKey

改用线程安全的 ConcurrentHashMap 并消除对同步的需要会好得多。

于 2013-08-08T06:30:24.767 回答