例如,在标准C11和C++ 11中,有6种类型的内存屏障:http://en.cppreference.com/w/cpp/atomic/memory_order
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中有多少种类型的内存屏障?或者只有两种类型?
允许所有重新排序
禁止所有重新排序
AnatolyG.. 5
Java语言或其标准库中没有明确指定的"内存障碍".有一个基于"之前发生"关系的Java内存模型(JMM).当然,JVM的实现使用一些内存障碍来实现JMM,但它们是特定于实现/硬件的.参见例如:http: //gee.cs.oswego.edu/dl/jmm/cookbook.html该文章定义了LoadLoad,LoadStore,StoreLoad,StoreStore抽象内存障碍(非标准,但广泛使用的术语)并描述了如何它们可以在特定硬件上实现.