首页 > 解决方案 > 易失性与最终领域的表现

问题描述

什么对性能更有利?假设没有小争论

  1. 具有可变字段的可变类并一一更新它们
  2. 具有最终字段的不可变类,更新周期避免了多字段更新,而是重新创建一次类

挥发物在每次写入时都需要内存屏障,我想最终字段也是如此?意味着对象构造时的单个内存屏障?

更新澄清:

考虑到 java 内存模型和当前的硬件,我觉得这个问题本身很有价值,并且一般可以回答。如果你必须假设细节:

标签: javaconcurrencymemory-model

解决方案


如果垃圾收集器在最后一次访问旧对象和为新对象腾出空间之间刷新每个线程的缓存,并且如果没有缓存行包含来自多个对象的数据,那么在大多数平台上自然不可能一个新构造的对象,在对该对象的引用存储在该线程可访问的位置之前加载到任何线程的缓存中,即使没有任何读取障碍(超出上述每 GC 周期一次的系统) -宽障碍)。此外,如果编译器可以判断一个对象的多个字段发生写入,而不会对引用可能已暴露的任何其他对象进行任何干预写入,则它可以忽略除最后一个之外的所有对象的写入障碍。

与需要创建更多对象来处理本可以使用字段“就地”完成的更改相比,使用字段的唯一时间final将更加昂贵。由于许多因素会影响对象创建成本,因此判断在特定系统上的特定情况下哪种方法更有效的唯一可靠方法通常是对两者进行基准测试。volatilevolatile


推荐阅读