创建对象流程
1.半初始化状态
申请内存空间,成员变量设置为变量类型的默认值
2.调用构造方法,成员变量设置为变量的初始值,初始化完成
3.建立引用关联,把实例变量和内存地址关联起来
半初始化
初始化完成
创建对象完成
this对象逃逸
对象的半初始化状态 指令的重排序 两者结合到一起的话就会出现this对象的逃逸
通过this访问对象的属性的值时候得到的是对象半初始化状态的值,这些值在java里面是变量类型的默认值。而不是真实设置的属性值.这种情况称为this逃逸
解决方案
不要在类的构造函数中启动一个新的线程
volatile禁止指令重排序
1.创建一个新对象的时候由于对象存在半初始化状态,在这个状态下对象的属性值是不为空的默认值
2.由于指令的重排序对象变量和内存地址的关联引用先于对象的初始化赋值步骤
3.在高并发的情况下
1.第三步指令对象t变量和内存地址建立关联的指令先于第二步指令对象t的构造函数执行
2.其它线程获取的t对象就不为null,但是t对象的属性值却不是期望的值,而是一些默认值
4.禁止创建对象的指令发生重排序