Java面试题

题目

你对内存屏障了解吗?描述一下他们。

答案

内存屏障的作用是为了解决 CPU 的自己的缓存和公共内存区域数据不一致问题。

Java 内存屏障分为 4 种,LoadLoad,StoreStore,LoadStore,StoreLoad。

  • LoadLoad 屏障:对于这样的语句 Load1;LoadLoad;Load2,在 Load2 及后续读操作要读取的数据被访问前,保证 Load1 要读取的数据被读取完毕。
  • StoreStore 屏障:对于这样的语句 Store1;StoreStore;Store2,在 Store2 及后续写入操作执行前,保证 Store1 的写入操作对其它处理器可见。
  • LoadStore 屏障:对于这样的语句 Load1;LoadStore;Store2,在 Store2 及后续写入操作被刷出前,保证 Load1 要读取的数据被读取完毕。
  • StoreLoad 屏障:对于这样的语句 Store1;StoreLoad;Load2,在 Load2 及后续读操作执行之前,保证 Store1 的写入对所有处理器可见。

Volatile 语义中的内存屏障:

​ 在写操作之前插入 StoreStore 屏障,在写之后插入 StoreLoad 屏障。

​ 在读之前插入 LoadLoad 屏障,在读操作后插入 LoadStore 屏障。