单例模式--容器单例
2019-11-24 本文已影响0人
wbpailxt
适合在程序初始化的时候,把多个单例对象放到map里边统一管理。
package com.geely.design.pattern.creational.singleton;
import org.apache.commons.lang3.StringUtils;
import java.util.HashMap;
import java.util.Map;
/**
* Created by geely
*/
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);
}
}
使用HashMap不是线程安全的,但是如果在ContainerSingleton类初始化的时候就把singletonMap初始化完成。也就是说在执行类初始化方法时把所有的单例对象都生成完并放到map里边,用的时候直接用也是可以的。
若希望是线程安全的,即不会存在线程取到的对象不是同一个,可以在putInstance方法上加同步锁或者同步锁HashMap。
package com.geely.design.pattern.creational.singleton;
import org.apache.commons.lang3.StringUtils;
import java.util.HashMap;
import java.util.Map;
/**
* Created by geely
*/
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) {
synchronized (singletonMap) {
if (!singletonMap.containsKey(key)) {
singletonMap.put(key, instance);
}
}
}
}
public static Object getInstance(String key) {
return singletonMap.get(key);
}
}
同步锁hashmap也是锁整个类。
改成HashTable会线程安全,但会影响性能。频繁取值的时候都会有同步锁。