争哥新年好, 有个问题想请教一下,单例的实现中看到过一种实现方式,包括在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版本吗
展开