概要
AtomicReferenceFieldUpdater
比 AtomicReference
用起来稍微有些麻烦,可大佬为什么更喜欢它?
正文
SafeContinuation
是挂起点定义时经常需要用到的一个用来保证结果正常返回的类,它当中有个成员 result
,这个成员由于可能被多个线程访问,因此存在保证线程安全的要求,不过奇怪的是, SafeContinuation
的开发者选择使用 AtomicReferenceFieldUpdater
来原子地更新这个成员,而没有使用更直接更便捷的 AtomicReference
类作为 result
的类型,这样做的原因是什么呢?
以 String
为例,我们对比下下面两种写法:
class UseAtomicRef {
val valueRef = AtomicReference<String>("")
}
代码语言:javascript复制class UseAtomicFieldUpdater {
companion object {
val valueUpdater = AtomicReferenceFieldUpdater.newUpdater(UseAtomicFieldUpdater::class.java,
String::class.java, "value")
}
@Volatile var value = ""
}
通过使用工具粗略估算这两个类的实例占用内存的大小,前者约 103B,后者约 29B,对于后者来说,用以保证修改原子性的 valueUpdater
是个共享的对象,因此对于可能创建较多实例的场景,应当考虑优先使用 AtomicReferenceFieldUpdater
以减少内存占用。
而 SafeContinuation
恰好就是一个经常被创建的类型,因此使用 AtomicReferenceFieldUpdater
能极大的减少内存压力。