NOTE
7.14 对象的创建过程
1. 代码 2. 字节码 2.1. 解释 可以看出 Test test = new Test(); 分成三个步骤 1. 创建Test实例 2. 对Test实例的属性val赋值 3. 把Test实例的引用赋值给test变量 第一个步骤执行完对象处于半初始化状态, 问题在于第2、3步骤,这两个步骤没有很
这是历史学习笔记,可能存在过时或不完整的理解。
1. 代码
public class Test
{
private Integer val = 10;
public static void main(String[] args)
{
Test test = new Test();
}
}
2. 字节码

2.1. 解释
可以看出Test test = new Test();分成三个步骤
- 创建Test实例
- 对Test实例的属性val赋值
- 把Test实例的引用赋值给test变量
第一个步骤执行完对象处于半初始化状态, 问题在于第2、3步骤,这两个步骤没有很大的依赖关系,那么根据CPU流水线技术可以对这两个指令进行重排序,也就是可能执行1-3-2
2.2. 解决
对val变量加上volatile修饰禁止指令重排序