文章目录
一、java内存屏障
1.1 what?
内存屏障是一个CPU指令。
① 确保一些特定操作执行的顺序
② 影响一些数据的可见性
编译器和CPU可以保证输出结果一样的情况下对指令重排序,使性能得到优化。
例:插入一个内存屏障,则相当于告诉CPU和编译器,先于这个命令的先执行,后于这个命令的必须后执行。
强制更新一次不同CPU的缓存。
例:一个写屏障会把这个屏障前写入的数据刷新到缓存,这样任何试图读取该数据的线程将得到最新之,而不用考虑道理是哪个cpu核心或者哪个cpu执行的。
1.2 why?
在cpu多核场景下,为了充分利用CPU,会通过流水线将指令并行进行。为了能并行,又需要将指令进行重排序,但是指令不是在所有场景下都能进行重排序,除了本身一些规则,我们还需要保证多CPU的告诉缓存中的数据与内存报纸一致性,不能确保内存与CPU缓存数据一致性的指令也不能重排。
内存屏障正式通过阻止屏障两边的指令重排序来避免编译器和硬件的不正确优化而提出的一种解决办法。
1.3 硬件层的内存屏障
① lfence:Load Barrier读屏障
② sfence :