new一个对象竟然不是原子操作?

那时你怎么说
你说对我的牵挂一朵朵
尤其是在犯困的夏日午后
那时你怎么说
你说大雨都是乌云在解脱
叫我赶紧回家钻进被窝

首先需要肯定的是:new操作不是原子操作!

public class Demo2 {
    public static void main(String[] args) {
        Demo2 demo2 = new Demo2();
    }
}

直接看main方法的字节码
new一个对象竟然不是原子操作?_第1张图片
重点4行字节码

0 new #2 <work/Demo2>
3 dup
4 invokespecial #3 <work/Demo2.<init>>
7 astore_1

new—创建一个对象,并将其引用值压入栈顶。

new一个对象竟然不是原子操作?_第2张图片

dup—复制栈顶一个字长的数据,将复制后的数据压栈。

new一个对象竟然不是原子操作?_第3张图片

invokespecial—编译时方法绑定调用方法。

也就是进行对象的初始化,调用构造方法
new一个对象竟然不是原子操作?_第4张图片

0 aload_0
1 invokespecial #1 <java/lang/Object.<init>>
4 return

aload_0—从局部变量0中装载引用类型值入栈,其实就是this操作
每个非静态方法,局部变量表index=0的位置永远存放的都是this

mian方法会弹出栈顶元素作为this对象
new一个对象竟然不是原子操作?_第5张图片
astore_1—将栈顶引用类型值保存到局部变量1中。

哪个是局部变量1?
new一个对象竟然不是原子操作?_第6张图片
new一个对象竟然不是原子操作?_第7张图片
完成变量demo2赋值操作

总结

new一个对象看起来是一行代码,但在内部实际性进行了4步操作,是非原子性的。

这也是为什么DCL双重检查需要volitile禁止指令重排序

文章持续更新,可以微信搜索「 绅堂Style 」第一时间阅读,回复【资料】有我准备的面试题笔记。
GitHub https://github.com/dtt11111/Nodes 有总结面试完整考点、资料以及我的系列文章。欢迎Star。
在这里插入图片描述

你可能感兴趣的:(JAVA,JVM,java,面试,jvm)