Java設計模式之容器單例模式
public class ContainerSingleton {
private ContainerSingleton(){}
private static Map<String , Object> map=new HashMap<>();
public static void putInstance(String key, Object value){
if (key!=null && !key.isEmpty() && value!=null){
if (!map.containsKey(key)){
map.put(key,value);
}
}
}
public static Object getInstance(String key){
return map.get(key);
}
}
其中使用Hashmap非線程安全,如果改成使用HashTable確實是線程安全的,但是會影響性能,不建議使用。能不能使用ConcurrentHashMap呢?這裏也不是絕對的線程安全。如果不考慮,序列化和反射攻擊問題,容器單例模式還是有一定的使用場景的。如果程序中單例對象非常多,可以使用容器對所有單例對象進行統一管理。
基於ThreadLocal的單例模式
不能保證程序全局唯一,但能保證線程唯一。以空間換時間,多線程下爲每個線程提供實例。
public class ThreadLocalInstance {
private static final ThreadLocal<ThreadLocalInstance> threadLocalInstance=
new ThreadLocal<ThreadLocalInstance>(){
@Override
protected ThreadLocalInstance initialValue() {
return new ThreadLocalInstance();
}
};
private ThreadLocalInstance(){}
public static ThreadLocalInstance getInstance(){
return threadLocalInstance.get();
}
}