使用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>的成本更高。
- 线程1端:需要额外创建
内存可见性没有优化空间
即便你想通过Supplier让线程2后续读取绕过volatile,也不可行:线程1更新AtomicReference<Supplier<MyObject>>时,线程2要看到最新的Supplier,必须做一次volatile读;而如果线程2缓存了Supplier,又会面临看不到新值的风险——这和直接用AtomicReference<MyObject>的内存模型没有任何区别,甚至更复杂。
如果你的核心诉求是优化“偶尔读取”场景下的性能,其实完全没必要动AtomicReference的类型,现代JVM已经对volatile操作做了足够的优化。
内容的提问来源于stack exchange,提问作者Novice User
相关产品推荐
相关产品推荐

