即使重排序对其他线程来说会产生明显的影响。
局部变量(Local variables) 方法定义参数(formal method parameters)和 异常处理参数(exception handler parameters)
不会在线程之间共享,它们不会有内存可见性问题,也不受内存模型的影响
JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存,每个线程都有一个私有的本地内存(Local memeory),
本地内存存储了该线程读写共享变量的副本
重排序
1.编译器优化的重排序
编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序
2.指令级并行的重排序。
现代处理器采用指令级并行技术(Instruction-Level Parallelism,ILP),将多条指令重叠执行,
如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序
3.内存系统的重排序。
由于处理器使用缓存和读写缓冲区,这使得加载和存储操作看上去可能是乱序执行的
源代码---》1.---》2----》3---》最终执行的指令序列
当一个域声明为volatile类型后,编译器于运行时会监视这个变量:它是共享的,
而且对他的操作不会与其他的内存操作一起呗重排序。volatile变量不会缓存在寄存器或者缓存在对其他处理器隐藏的地方,
左移读一个volatile类型的变量时,总会返回某一线程所写入的最新值。