欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-12 15:07:08
...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

哪个是局部变量1?
new一个对象竟然不是原子操作?
new一个对象竟然不是原子操作?
完成变量demo2赋值操作

总结

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

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

文章持续更新,可以微信搜索「 绅堂Style 」第一时间阅读,回复【资料】有我准备的面试题笔记。
GitHub https://github.com/dtt11111/Nodes 有总结面试完整考点、资料以及我的系列文章。欢迎Star。
new一个对象竟然不是原子操作?