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的有效用途吗?
答案 0 :(得分:9)
这不是单身人士。它被称为multiton pattern。
而不是每个应用程序具有单个实例 ,而是确保多个模式确保单个实例每个键。
答案 1 :(得分:3)
这个multiton似乎坏了,因为它使用了一个双重检查的锁定习惯用法,它在Java中不是线程安全的。特别是,当使用getInstance(s)
非空字符串调用s
时,您可以收到指向ConnectionManager
为空的dsKey
的非空引用。
使用线程安全的ConcurrentHashMap会更好,并且不需要同步。