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

概要

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

正文

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

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

 
 
  1. class UseAtomicRef {

  2.    val valueRef = AtomicReference<String>("")

  3. }

 
 
  1. class UseAtomicFieldUpdater {

  2.    companion object {

  3.        val valueUpdater = AtomicReferenceFieldUpdater.newUpdater(UseAtomicFieldUpdater::class.java,

  4.                String::class.java, "value")

  5.    }

  6.    @Volatile var value = ""

  7. }

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

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


转载请注明出处:微信公众号 Kotlin

640?wx_fmt=jpeg


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值