概述
容器单例的思路是这样的,维护一个Map,把单例的实例都存放进该Map中,用的时候只从该Map中取,试图实现单例;但这种思路有局限性,Map中存的单例对象是可以被更新掉的,如果两次取的间隔,发生了单例对象的更新,就会取到2个不同的对象,破坏了单例性;
- 如果程序中单例类很多,可以考虑用一个容器管理起来;
容器单例实现
- 很容易使用多线程Debug从容器singleMap中获取不一样的实例;
- 但也不建议使用HashTable管理单例,性能太慢;
import org.apache.commons.lang3.StringUtils;
import java.util.HashMap;
import java.util.Map;
public class ContainerSingleton {
private ContainerSingleton(){}
private static Map<String,Object> singletonMap = new HashMap<String,Object>();
public static void putInstance(String key,Object instance){
if(StringUtils.isNotBlank(key) && instance != null){
if(!singletonMap.containsKey(key)){
singletonMap.put(key,instance);
}
}
}
public static Object getInstance(String key){
return singletonMap.get(key);
}
}
public class T implements Runnable {
@Override
public void run() {
ContainerSingleton.putInstance("object", new Object());
Object instance = ContainerSingleton.getInstance("object");
System.out.println(Thread.currentThread().getName() + " : " + instance);
}
}
public class Test {
public static void main(String[] args) {
Thread t1 = new Thread(new T());
Thread t2 = new Thread(new T());
t1.start();
t2.start();
System.out.println("Program End");
}
}
输出:
Thread-1 : java.lang.Object@238eb394
Thread-0 : java.lang.Object@793b2bf6
Program End
本文探讨了容器单例模式的实现思路与局限性,通过一个具体示例展示了如何使用Map来管理单例对象,以及多线程环境下可能出现的问题。虽然这种方法能够集中管理多个单例,但在并发场景下可能破坏单例特性。
429

被折叠的 条评论
为什么被折叠?



