沒有将变量设置成volatile,会有下面问题:
new是操作不说原子性的,他包含操作:
1,分配内存地址,allocate memory
2,初始化对象, initialize object
3,将引用变量指向内存,make referent variable point to memory
由于jvm的重排列re-order问题,会将2和3调转,导致沒有完成初始化就使用而有epx
加了volatitle禁止了重排列,导致了再获得对象前,都会被阻塞在同步代码块中。
所以核心问题就是:在初始化时候同步了,而沒有在修改操作中同步。
引申问题:一个变量在不同的同步块中是不会同步的。