为更加快的执行 采用流水线的形式执行代码 所以代码之间采用了重排序 。
所以才有线程之间或者是单线程之间 可见性 顺序一致性问题(别的线程看到的顺序是否 与本线程实际执行的顺序一致)。
想要解决这两个问题 需要:
1)单线程采取正确的指令重排序。
2)多线程之间要正确的同步,那如何保证正确的同步捏 可以采取sny(jdk1.5)或者是 lock。
通过加锁也可以让多个处理完有顺序执行,
那么程序员要怎么样才能判断多线程之间是否正确同步,通过happen-before规则可以辨证(也可以看是否有数据争夺)。
从JAVA 源代码到最终实际执行的指令序列, 会经历3种重排序:
1,编译器优化重排序: 在不改变单线程程序语义的前提下, 重新安排语句的执行顺序. 2,指令级并行的重排序: 如果不存在数据依赖性, CPU 可以改变语句对应机器指令的执行顺序. 采用ILP(指令级并行技术) 来将多条指令重叠执行. 3,内存系统的重排序: 由于CPU 私用缓存和读/写缓冲区, 加载和存储操作看起来是在乱序执行.