【发布时间】:2017-04-17 22:34:56
【问题描述】:
我正在研究 x86 硬件中 Java 中易失性写入的成本。 我计划在共享内存位置上使用 Unsafe 的 putLongVolatile 方法。查看实现,putLongVolatile get 被转换为 Link 中的 Unsafe_SetLongVolatile,随后转换为 AtomicWrite,然后是栅栏 Link
简而言之,每个易失性写入都会转换为原子写入,然后是一个完整的围栏(mfence 或 x86 中的锁定添加指令)。
问题:
1) 为什么 x86 需要 fence() ?由于商店-商店排序,一个简单的编译器障碍还不够吗?完整的围栏似乎非常昂贵。
2) 用 unsafe 的 putLong 代替 putLongVolatile 是更好的选择吗?它在多线程情况下是否可以正常工作?
【问题讨论】:
-
让我给出我的一般优化意见:可能没关系。首要任务是找到应用程序的瓶颈,然后您可以进行更有意义的基准测试和优化。
标签: java multithreading volatile