因为存在重排序的过程所以我们要解决2个问题
对于单线程来说,cpu可以保证程序执行的结果(可能经过重排序)和顺序执行代码的结果一致。编译器、和处理器进行重排序时都满足as-if-serial语义
在单线程中满足as-if-serial语义,那在多线程中就不同了!!!!!!
假如cpu按如下顺序执行指令
要解决这个问题,必须要有一种策略保证obj.ready=true 比 obj.data=1先执行这个机制就是内存屏障
java中很多关键字的特性就是通过封装内存屏障实现的
更多参考:http://ifeve.com/linux-memory-barriers/#memory-barriers
引起内存可见性的原因,cpu、线程都有自己的缓存区,更新的变量没有及时刷新到共享内存,导致其他线程不可见
如下图,要保证程序正常执行:
看看需要哪些技术可以保证以上5各步骤正常运行
参考:http://blog.csdn.net/dlutbrucezhang/article/details/10170649