概述
容器单例的思路是这样的,维护一个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