上篇文章介绍到, MESI 优化后无法保证缓存间的强一致性,这时候如果程序中确实需要强一致性时,该怎么办?答案就是本篇要介绍的内存屏障。
内存屏障,为开发人员提供了一种强一致性的编程接口。内存屏障通常有两种:写内存屏障和读内存屏障。
写内存屏障
cpu 执行到屏障时,会将之前 store-buffer 中的数据写回主存。相当于执行了一次 store-write 操作。
读内存屏障
cpu 执行到该屏障时,会将cpu 中 invalid-queue 中的 invalid 指令全部执行完,重新读取主存内的数据,相当于执行了一次 read-load 操作。
JVM 对内存屏障的支持
JVM 中的JMM 刚好也有类似于高速缓存一致性的问题,所以提供了 volatile 、 synchronized 关键字来实现强制一致性,底层封装了内存屏障的指令操作。