静态属性初始化问题,我写的是在静态代码块中获取spring 容器中的jackson,但是最终领导改成了双检锁获取实例,不知道这两种有什么区别

今天领导让写了一个jackson的工具类,我写的是在静态代码块中获取spring 容器中的jackson,但是最终领导改成了双检锁获取实例,不知道这两种有什么区别,求解
private static ObjectMapper objectMapper = null;
//自己写的
static {
        objectMapper = SpringUtil.getBean(ObjectMapper.class);
    }

//领导写的
private static ObjectMapper getObjectMapper(){
        if (Objects.isNull(objectMapper)){
            synchronized (JsonUtils.class){
                if (Objects.isNull(objectMapper)){
                    objectMapper = SpringUtil.getBean(ObjectMapper.class);
                }
            }
        }
        return objectMapper;
    }

SpringUtil如果没有被spring容器回调,类加载时机又早,你这启动时获取bean大概率出现空指针异常,人家用的时候才获取,虽然也可能出现空指针,但是一般手动触发,如果是运行时触发而不是启动触发这个获取方法,基本不会出现空指针

都是单例模式 你的是饿汉式,领导是懒汉式,双重锁减少开销。
简单说就是领导保证了性能,减少了开销,使用的时候才创建。
这里应该是不需要指令重排,因为bean已经在spring容器里。