多线程执行List的addAll方法产生的并发问题

文章描述了一个问题,使用CompletableFuture进行分批异步查询时,结果集中出现了大量null对象。经过排查,问题可能出在并发操作导致的数据同步问题,通过将List替换为CopyOnWriteArrayList解决了空对象问题。

问题分析

将查询条件subList分为70个一组,通过CompletableFuture执行异步多线程分批次查询数据库,查询完成后在whenCompleteAsync方法中将结果存储在resultList中。

诡异的情况发生了,查询出来的结果resultList中有10000个数据,其中70 * n个为null的对象

try {
   
   
    //分页的参数 每个大小70 总大小100000
    List<List<Long>> subList = ......;
    //结果集
    List<QueryEntity> resultList = new ArrayList<>();
    //全流式处理转换成CompletableFuture[]+组装成一个无返回值CompletableFuture,join等待执行完毕。返回结果whenComplete获取
    CompletableFuture[] cfs = subList.stream().map(list -> CompletableFuture.supplyAsync(() -> queryS
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值