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

多线程场景下AtomicLong的get操作归属及代码实现合理性咨询

使用AtomicLong实现多线程下long变量的可见性是否可行?

你的实现完全可行!

首先,你的代码是多线程环境下保证long类型变量可见性的标准正确做法之一:

  • AtomicLong 是Java并发包专为原子操作和线程安全设计的类,它的get()和set()方法都具备volatile语义——这意味着所有线程读取到的key值都是最新的,不会因为CPU缓存不一致出现读取旧值的问题。
  • 你用private final修饰AtomicLong的引用,确保这个引用不会被意外替换,所有线程操作的都是同一个AtomicLong实例,这进一步保证了线程安全。
  • 封装的getKey()和setKey()方法直接委托给AtomicLong的对应方法,逻辑清晰,符合面向对象的封装原则。

如果你的场景只是需要多线程下的可见性,其实volatile long也能满足,但AtomicLong的优势在于它还支持原子复合操作(比如incrementAndGet()、compareAndSet()),如果未来业务需要扩展这类操作,直接在ClassHoldingLong里新增方法即可,扩展性更强。

谁来负责执行get操作?

这个问题得看你的业务逻辑,但从封装和低耦合的角度出发:

  • 最好由ClassHoldingLong通过你已经定义的getKey()方法来对外提供取值能力——你已经把key设为private,这就对了,外部类不应该直接接触底层的AtomicLong实例。
  • 这么做的好处是:如果以后你需要修改取值逻辑(比如加日志、加缓存,甚至替换成其他并发实现),只需要修改ClassHoldingLong的getKey()方法,所有调用方都不需要改动,极大降低了维护成本。
  • 举个实际场景:其他业务类需要获取这个值时,只需要调用yourClassHoldingLongInstance.getKey()即可,它们不需要知道底层是AtomicLong还是普通的volatile long,完全依赖ClassHoldingLong提供的接口。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:13:04