上述后两个属于处理器重排序,JMM的处理器重排序规则会要求Java编译器在生成指令序列时,插入特定类型的内存屏障指令来禁止特定类型的处理器重排序
load和store是两种原子操作(JVM一共规定了8种,可以了解一下),分别表示将工作内存中的变量刷新到副本中和将工作内存中的变量的值传到主内存中,有 四种内存屏障,其中 是一个全能型屏障,一般的多处理器都支持这个屏障,它的含义是在这个内存屏障之前的store和之后的load指令不能重排序
与程序员密切相关的重要规则如下
注意这个规则仅仅要求前一个操作对后一个操作可见,没有执行上的先后顺序
锁释放和获取的内存语义和 的写和读有相同的内存语义
我们知道,新版本的Java的final对象是线程安全的,那么它是如何实现的呢?主要是应用到了写和读final域的重排序规则,具体如下
由于x86处理器的性质,在这个处理器中,final域读写不会插入任何内存屏障