new一个对象竟然不是原子操作?
程序员文章站
2024-03-12 15:07:08
...
那时你怎么说
你说对我的牵挂一朵朵
尤其是在犯困的夏日午后
那时你怎么说
你说大雨都是乌云在解脱
叫我赶紧回家钻进被窝
首先需要肯定的是:new操作不是原子操作!
public class Demo2 {
public static void main(String[] args) {
Demo2 demo2 = new Demo2();
}
}
直接看main方法的字节码
重点4行字节码
0 new #2 <work/Demo2>
3 dup
4 invokespecial #3 <work/Demo2.<init>>
7 astore_1
new—创建一个对象,并将其引用值压入栈顶。
dup—复制栈顶一个字长的数据,将复制后的数据压栈。
invokespecial—编译时方法绑定调用方法。
也就是进行对象的初始化,调用构造方法
0 aload_0
1 invokespecial #1 <java/lang/Object.<init>>
4 return
aload_0—从局部变量0中装载引用类型值入栈,其实就是this操作
每个非静态方法,局部变量表index=0的位置永远存放的都是this
mian方法会弹出栈顶元素作为this对象
astore_1—将栈顶引用类型值保存到局部变量1中。
哪个是局部变量1?
完成变量demo2赋值操作
总结
new一个对象看起来是一行代码,但在内部实际性进行了4步操作,是非原子性的。
这也是为什么DCL双重检查需要volitile禁止指令重排序
文章持续更新,可以微信搜索「 绅堂Style 」第一时间阅读,回复【资料】有我准备的面试题笔记。
GitHub https://github.com/dtt11111/Nodes 有总结面试完整考点、资料以及我的系列文章。欢迎Star。
上一篇: 二叉树 给定n,求子树包含的节点(递归)