这是哪种单身人士?

时间:2013-08-08 06:24:00

标签: java design-patterns singleton

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模式的地方看到了这段代码。 Singleton正在存储Map个自己的实例。

这可以称为什么样的单身人士?或者这是Singleton的有效用途吗?

2 个答案:

答案 0 :(得分:9)

这不是单身人士。它被称为multiton pattern

  

而不是每个应用程序具有单个实例 ,而是确保多个模式确保单个实例每个键

答案 1 :(得分:3)

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

使用线程安全的ConcurrentHashMap会更好,并且不需要同步。