Java中有多少种类型的内存屏障?

时间:2014-02-27 14:04:59

标签: java multithreading concurrency java.util.concurrent

例如,在标准 C11 C++11 中,功能 6 类型的内存障碍:{ {3}}

  • memory_order_relaxed
  • memory_order_consume
  • memory_order_acquire
  • memory_order_release
  • memory_order_acq_rel
  • memory_order_seq_cst

这决定了编译器可以重新排序指令的方向,以及处理器指令需要插入哪些以限制处理器流水线中的重新排序。 例如,前五个障碍只影响编译器,但不生成任何CPU指令(无S/L/ MFENCE),因为在x86中 - 自动提供了acquire-release-semantics。

Java中有多少种类型的内存屏障? 或者只有两种类型?

  • 允许所有重新排序
  • 禁止所有重新排序

1 个答案:

答案 0 :(得分:5)

Java语言或其标准库中没有明确指定的“内存障碍”。有一个基于“之前发生”关系的Java内存模型(JMM)。当然,JVM的实现使用一些内存障碍来实现JMM,但它们是特定于实现/硬件的。例如,见: http://gee.cs.oswego.edu/dl/jmm/cookbook.html 那篇文章定义了LoadLoad,LoadStore,StoreLoad,StoreStore抽象内存障碍(非标准,但是广泛使用的术语),并描述了如何在特定硬件上实现它们。