创建对象流程

    1.半初始化状态
       申请内存空间,成员变量设置为变量类型的默认值
    2.调用构造方法,成员变量设置为变量的初始值,初始化完成
    3.建立引用关联,把实例变量和内存地址关联起来

     

new对象底层分析_默认值

半初始化

        

new对象底层分析_默认值_02

初始化完成

        

new对象底层分析_重排序_03

创建对象完成

       

new对象底层分析_默认值_04

this对象逃逸

        对象的半初始化状态    指令的重排序 两者结合到一起的话就会出现this对象的逃逸

        通过this访问对象的属性的值时候得到的是对象半初始化状态的值,这些值在java里面是变量类型的默认值。而不是真实设置的属性值.这种情况称为this逃逸

        

new对象底层分析_重排序_05

        

new对象底层分析_默认值_06

       解决方案

            不要在类的构造函数中启动一个新的线程

            

new对象底层分析_重排序_07

volatile禁止指令重排序

         1.创建一个新对象的时候由于对象存在半初始化状态,在这个状态下对象的属性值是不为空的默认值

         2.由于指令的重排序对象变量和内存地址的关联引用先于对象的初始化赋值步骤

         3.在高并发的情况下 

             1.第三步指令对象t变量和内存地址建立关联的指令先于第二步指令对象t的构造函数执行

             2.其它线程获取的t对象就不为null,但是t对象的属性值却不是期望的值,而是一些默认值

         4.禁止创建对象的指令发生重排序

           

new对象底层分析_初始化_08

         

new对象底层分析_重排序_09