主题: 内存模型,硬件的内存模型,指令重排
内容:
硬件层面的内存模型
指令重排和乱序问题(以x86cpu来说明)
硬件层面:
cpu在执行一条指令时,由于它的速度特别快,所以,为了提高效率,它去执行后面与它无依
赖 关系的指令,这时候,所有的指令就不是按顺序执行了,具体体现在java代码中可能就会
有一些奇怪的现象,在硬件层面,提供了内存屏障和(或)lock..
指令锁住内存子系统(两个中的其中一个就可以实现)来使某指令上下不发生重排现象。
(savefence),lfence (loadfence),mfence(l和s的合并)等屏障。
简单说明: lfence:load | 在fence(屏障)指令前的读操作必须在fence指令后的读操作之前完成。
JVM级别的规范
LoadLoad屏障 : load1 ; LoadLoad ; Load2 解释:在load2执行之前,要保证load1执行完毕
LoadStore屏障 : load1 ; LoadStore ; store2 解释:在store2后续写入操作被刷出前,要保证load1执行完毕
StoreLoad屏障 : store1 ; StoreLoad ; load2 解释: 在load2执行之前,要保证store1执行完毕,并对其他处理器可见。
StoreStore屏障 :store1 ;StoreStore ; store2 解释:在store2执行之前,要保证store1执行完毕,并对其他处理器可见