You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用AtomicReference<Supplier<MyObject>>能否规避volatile值的性能开销?

改用AtomicReference<Supplier>无法提升性能,反而可能增加开销

这种改动不仅不会提升性能,反而可能因为额外的对象包装和方法调用带来不必要的开销,原因如下:

  • volatile读写的实际开销极低
    现代CPU对volatile的支持已经很成熟,AtomicReference::get的volatile读操作,本质上只是禁止CPU重排序、保证内存可见性,实际执行的开销非常小,尤其是在线程2“仅偶尔需要获取值”的场景下,这点开销几乎可以忽略不计。

  • 包装Supplier带来额外成本

    • 线程1端:需要额外创建Supplier<MyObject>实例(比如用() -> myObject这样的lambda),再调用AtomicReference::set写入volatile字段——这个写入动作的开销和直接写MyObject完全一致,还多了对象实例化的成本。
    • 线程2端:获取值时需要先做一次volatile读拿到Supplier,再调用Supplier::get()获取实际的MyObject,多了一次方法调用的开销,比直接读AtomicReference<MyObject>的成本更高。
  • 内存可见性没有优化空间
    即便你想通过Supplier让线程2后续读取绕过volatile,也不可行:线程1更新AtomicReference<Supplier<MyObject>>时,线程2要看到最新的Supplier,必须做一次volatile读;而如果线程2缓存了Supplier,又会面临看不到新值的风险——这和直接用AtomicReference<MyObject>的内存模型没有任何区别,甚至更复杂。

如果你的核心诉求是优化“偶尔读取”场景下的性能,其实完全没必要动AtomicReference的类型,现代JVM已经对volatile操作做了足够的优化。

内容的提问来源于stack exchange,提问作者Novice User

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 03:42:17