java future专题 2-1 CompletableFuture源码探秘-基础用法(1)

CompletableFuture的使用方式有很多,但是殊途同归,很多用法在底层原理上是相同的,我们这里找几种典型的使用场景,从易到难,逐步揭开CompletableFuture源码的神秘面纱。

1.举例

首先上个最简单的例子:

1)thenRun配合complete

CompletableFuture配合thenRun和complete方法,通过complete触发thenRun。demo样例:

源码分析:

先看thenRun流程

①调用thenRun的时候,会调用uniRunStage。

这里首先会创建一个CompletableFuture,叫做dep。调用dep的uniRun方法,此时this的result是null,所以该方法返回false。继续向下执行。

然后构造UniRun对象,包含了上述dep。相应的,用户构造的CompletableFuture叫做src。

②然后调用push将UniRun对象压栈。

根据注释,如果result有内容说明已经设置过结果了,就不会再操作,否则就调用tryPushStack方法压栈。如果压栈失败则将next清掉。tryPushStack失败且result是空的情况下,该循环会一直进行下去,直到result被设置(少部分场景)或者tryPushStack(大部分场景)竞争压栈成功。

这里会将Completion的next字段设置为next,该操作不是原子的,因为每次执行到这里,c都是重新构造出来的,所以不存在多线程竞争问题。

这里会设置next字段,同时原子设置stack字段。这里使用原子操作是因为当前CompletableFuture(src)可能会多个线程同时操作,有并发问题。最终竞争成功的压栈操作会返回true从而技术上面那个while循环。

这里大部分都是通过Unsafe的相关方法来进行赋值操作,这种方式直接操作内存,效率高。Unsafe相关操作参考:https://www.jianshu.com/p/7322ef0ee6c9

③push结束之后调用completion的tryFire方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值