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

4
例如,在标准C11C++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中,获取-释放语义是自动提供的。
Java中有多少种内存屏障类型? 或者只有两种吗?
  • 允许所有重新排序
  • 禁止所有重新排序

2
尝试了解“蟑螂旅馆”模型,它在很大程度上回答了你的问题。 - Marko Topolnik
1
C++11只有两个屏障,即“线程屏障”和“信号屏障”。然而,这些都可以通过内存顺序参数进行配置。 - Kerrek SB
@Kerrek SB 我的意思是 - memory_order,它可以用于“线程屏障”、“信号屏障”或“原子变量”。 - Alex
1
Java内存模型是Java规范的一部分。 - Kerrek SB
@Alex "memory_order可以用于“线程栅栏”、“信号栅栏”"。只有一些值对栅栏有意义:对于信号栅栏,只有方向(acq和rel)对其有意义;此外,seq_cst对于线程栅栏有意义。其他值仅对原子操作有意义。 - curiousguy
例如,前五个障碍只影响编译器,而不会生成任何CPU指令。你的问题是针对英特尔的吗?你能重新写一下这句话吗? - curiousguy
1个回答

5
Java语言及其标准库的规范中没有明确指定“内存屏障”。Java内存模型(JMM)是基于“happens before”关系的。当然,JVM的实现会使用一些内存屏障来实现JMM,但它们是实现/硬件特定的。例如,请参见: http://gee.cs.oswego.edu/dl/jmm/cookbook.html 该文章定义了LoadLoad、LoadStore、StoreLoad、StoreStore抽象内存屏障(非标准术语,但广泛使用),并描述了如何在特定硬件上实现它们。

请注意,问题中列出的常量不是障碍,它们是指令。 - curiousguy
问题从订单作为示例开始,但特别涉及内存屏障(包括另一个列表S、L、MFENCE)。屏障只是管理(重新)排序的方法。 - AnatolyG
问题的措辞非常混乱。有顺序的混合,屏障,x86保证等等...我的观点是memory_order_X并不描述"屏障"。 - curiousguy
“从正式的角度来说,问题的措辞非常混乱。”但是我认为理解问题所涉及的内容并没有问题。 - AnatolyG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接