new一个对象的时候,其实在jvm层面,是要做很多事情的,根本不是一步完成的。
1.分配一块内存
2.调用类的构造函数
3.然后回写回去、
最起码要有这几步,实际在jvm层面要做更多的事情,也就是说:会有"不完全对象"(构造函数未执行)的问题。
也就是说:最终解决的是cpu乱序执行指令的问题,加了volatile,会保证内存会回写回去。
构造函数未执行,就会拿到未初始化完的对象这么一个问题。
-----------------
c++层面的可见性,由于不是操作的内存副本,因此基本上都会回写,而加了volatile,则是立即回写。不加按道理,也是会立马回写,但是加上后,更加准确的保证。
而且编译优化后,在某些平台上,c++层面加不加volatile,甚至编译后的汇编代码一样。