【问题标题】:is volatile of no use on x86 processors在 x86 处理器上是 volatile 没用
【发布时间】:2011-04-06 22:35:37
【问题描述】:

我在某处读到 x86 处理器具有缓存一致性,并且可以在每次写入时跨多个内核同步字段的值。

这是否意味着如果我们计划只在 x86 处理器上运行,我们可以在不使用 java 中的“volatile”关键字的情况下进行编码?

更新:

好吧,假设我们忽略指令重新排序的问题,我们是否可以假设在 x86 处理器上不存在对非易失性字段的分配问题在内核中不可见?

【问题讨论】:

  • Java 是否支持 DMA(例如用于 CD 驱动器和内存映射 I/O)?
  • 你为什么要这样做?随便用吧。
  • 如果你有多个处理器怎么办?

标签: java concurrency synchronization volatile


【解决方案1】:

不——volatile 关键字的含义不仅仅是缓存一致性;它还限制了运行时可以做什么和不能做什么,比如延迟构造函数调用。

【讨论】:

  • 具体来说,Hotspot 在将代码编译为本机代码时如何对其进行优化。
【解决方案2】:

关于您的更新:不,我们不能。其他线程可以在不更新变量的情况下读取过时的值。还有一个问题:JVM可以优化代码,只要能保证单线程的行为是正确的。

这意味着类似:

public boolean var = true;
private void test() {
    while (var) {
       // do something without changing var
    }
}

如果需要,JIT 可以将其优化为 while(true)!

【讨论】:

    【解决方案3】:

    can sync the value of fieldsalways syncs the value of fields 之间存在很大差异。如果你有 volatile,x86 可以同步字段,否则它不会也不应该。

    注意:易失性访问可能比非易失性访问慢 10-30 倍,这是它并非一直完成的关键原因。

    顺便说一句:您知道任何多核、普通 x86 处理器吗?我原以为大多数是支持 x86 的 x64。

    【讨论】:

    • 对于这 10-30 倍的慢速你有任何基准/示例吗?我在变量上使用了 volatile,这些变量被读取了很多次,并且在 volatile 和 non-volatile 版本之间几乎没有性能差异。
    • 如果只在单线程中访问该字段,性能差异很小。但是,当一个字段在线程之间共享时,它会大得多。 IE。缓存相当智能。您是否积极地在线程之间共享字段?
    • 我看到易失性访问需要 26 纳秒,而非易失性访问需要 2 纳秒。问题是要避免微基准测试的陷阱,因为微基准测试可以将所有内容减少到几乎为零。 ;)
    • 当你说访问是指存储/加载或两者兼而有之。缓存一致系统上的易失性负载非常接近于正常负载。
    • @John V,我发现这在很大程度上取决于系统的架构。访问陈旧值的负载和访问非陈旧值的负载往往非常不同。
    【解决方案4】:

    对于 JVM 应如何处理 volatile 有非常准确的规范,如果它选择使用特定于 cpu 的指令来执行此操作,那么对您有好处。

    您应该说“我们知道在这个平台上 cpu 的行为类似于..”的唯一地方是在需要符合 cpu 的本地代码中链接时。在所有其他情况下,写入规范。

    请注意,volatile 关键字对于编写在多个 cpu 上运行的健壮代码非常重要,每个 cpu 都有自己的缓存,因为它告诉 JVM 忽略本地缓存并获取官方值而不是 5 分钟前的缓存值。你通常想要那个。

    【讨论】:

      【解决方案5】:

      写入字节码甚至不必导致写入机器码。除非是易失性写入。

      【讨论】:

        【解决方案6】:

        我可以保证volatile 有一些用处。我一直处于这样一种情况,一个线程的变量为“null”,另一个线程中设置的变量具有正确的值。调试不好玩。对所有共享字段使用 volatile :)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-12-17
          • 2020-04-19
          • 2021-01-12
          • 1970-01-01
          • 2010-11-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多