提交 432883aa 编写于 作者: C ChoKhoOu

optimized SingletonFactory

上级 45a23896
......@@ -3,6 +3,7 @@ package github.javaguide.factory;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 获取单例对象的工厂类
......@@ -11,22 +12,32 @@ import java.util.Map;
* @createTime 2020年06月03日 15:04:00
*/
public final class SingletonFactory {
private static final Map<String, Object> OBJECT_MAP = new HashMap<>();
private static final Map<String, Object> OBJECT_MAP = new ConcurrentHashMap<>();
private static final Map<Class<?>, Object> LOCK_MAP = new ConcurrentHashMap<>();
private SingletonFactory() {
}
public static <T> T getInstance(Class<T> c) {
if (c == null) {
throw new IllegalArgumentException();
}
String key = c.toString();
Object instance;
synchronized (SingletonFactory.class) {
instance = OBJECT_MAP.get(key);
if (instance == null) {
try {
instance = c.getDeclaredConstructor().newInstance();
OBJECT_MAP.put(key, instance);
} catch (IllegalAccessException | InstantiationException | NoSuchMethodException | InvocationTargetException e) {
throw new RuntimeException(e.getMessage(), e);
Object instance = OBJECT_MAP.get(key);
if (instance == null) {
synchronized (LOCK_MAP.computeIfAbsent(c, k -> new Object())) {
instance = OBJECT_MAP.get(key);
if (instance == null) {
try {
instance = c.getDeclaredConstructor().newInstance();
OBJECT_MAP.put(key, instance);
} catch (IllegalAccessException
| InstantiationException
| NoSuchMethodException
| InvocationTargetException e) {
throw new RuntimeException(e.getMessage(), e);
}
}
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册