多线程场景下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
相关产品推荐
相关产品推荐

