关于枚举单例模式+策略模式的使用

来源:13-13 单例模式3

波粒二象性max

2020-05-11

老师您好,想请教个问题,就是我想写个一个接口多个实现,然后这个实现在被调用的时候初始化一次,每个实例里面可能有不同的数据库mapper,老师帮我看看,这样写是否有问题。

  • Test一个接口,两个实现:Test1、Test2
  • Singleton8枚举单例
  • SpringUtils获取spring bean的工具类
public enum Singleton8 {
    INSTANCE;

    private Map<String, Test> map = new HashMap<>();

    Singleton8() {
        Test test1 = SpringUtils.getBean(Test1.class);
        Test test2 = SpringUtils.getBean(Test2.class);
        map.put("a", test1);
        map.put("b", test2);
    }

    public Test get(String key) {
        return map.get(key);
    }
}

public interface Test {
    void print();
}

public class Test1 implements Test{

    @Override
    public void print() {
        System.out.println("1");
    }
}

public class Test2 implements Test{
    @Override
    public void print() {
        System.out.println("2");
    }
}

主要是有以下疑惑

  • Singleton8() {…} 这个构造方法的初始化是不是由jvm保证了它里面代码的线程安全
  • 这个map如果有高并发的get,是不是就不能保证获取到的实现类是我需要的那个实现类了,要换成ConcurrentHashMap,
  • 或则说这种写法就是不对的。。
写回答

1回答

悟空

2020-05-11

  1. 如果只是get,那就是安全的

1
0

线程八大核心+Java并发原理及企业级并发解决方案

完整的并发知识网络+丰富的工作内容分享+50余道并发高频面试题

2512 学习 · 939 问题

查看课程