Douglas
2020-02-05
争哥新年好, 有个问题想请教一下,单例的实现中看到过一种实现方式,包括在spring源码中有类似的实现 ,代码如下
 1. public class Singleton {
    private static volatile Singleton instance=null;
    private Singleton() {
    }

    public static Singleton getInstance() {//
        Singleton temp=instance; // 为什么要用局部变量来接收
        if (null == temp) {
            synchronized (Singleton.class) {
                temp=instance;
                if (null == temp) {
                    temp=new Singleton();
                    instance=temp;
                }
            }
        }
        return instance;
    }
}

spring源码 如 ReactiveAdapterRegistry。
JDK 源码 如 AbstractQueuedSynchronizer。
很多地方 都有用 局部变量 来接收 静态的成员变量, 请问下 这么写有什么性能上的优化点吗?
jcu 包下面类似的用法太多。想弄明白为什么要这样写
2. 看jdk 官方的文档(JMM)有说明 指令重排发生的地方有很多 ,编译器,及时编译,CPU在硬件层面的优化,看spring 比较新的代码也使用volatile来修饰,你说的new 关键字和初始化 作为原子操作 可以说一下 大概的jdk版本吗
1
评论 1
失火的夏天
不是局部变量来接受静态变量,而是你这个静态变量有了 volatile 关键字,需要从主存同步,修改又要同步到主存,消耗了io,而局部变量和主存无关,只要最后一次同步到主存上去就好了
2020-02-05