前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >协程源码中的原子操作为什么使用 AtomicReferenceFieldUpdater?

协程源码中的原子操作为什么使用 AtomicReferenceFieldUpdater?

作者头像
bennyhuo
发布2020-02-20 13:21:37
5740
发布2020-02-20 13:21:37
举报
文章被收录于专栏:BennyhuoBennyhuoBennyhuo

概要

AtomicReferenceFieldUpdaterAtomicReference 用起来稍微有些麻烦,可大佬为什么更喜欢它?

正文

SafeContinuation 是挂起点定义时经常需要用到的一个用来保证结果正常返回的类,它当中有个成员 result,这个成员由于可能被多个线程访问,因此存在保证线程安全的要求,不过奇怪的是, SafeContinuation 的开发者选择使用 AtomicReferenceFieldUpdater 来原子地更新这个成员,而没有使用更直接更便捷的 AtomicReference 类作为 result 的类型,这样做的原因是什么呢?

String 为例,我们对比下下面两种写法:

class UseAtomicRef {
    val valueRef = AtomicReference<String>("")
}
class UseAtomicFieldUpdater {
    companion object {
        val valueUpdater = AtomicReferenceFieldUpdater.newUpdater(UseAtomicFieldUpdater::class.java,
                String::class.java, "value")
    }
    @Volatile var value = ""
}

通过使用工具粗略估算这两个类的实例占用内存的大小,前者约 103B,后者约 29B,对于后者来说,用以保证修改原子性的 valueUpdater 是个共享的对象,因此对于可能创建较多实例的场景,应当考虑优先使用 AtomicReferenceFieldUpdater 以减少内存占用。

SafeContinuation 恰好就是一个经常被创建的类型,因此使用 AtomicReferenceFieldUpdater 能极大的减少内存压力。


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-03-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Kotlin 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概要
  • 正文
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档