ArrayList多线程调用add()可能出现的问题

ArrayList在多线程调用Add()添加元素时的下标越界问题
高并发下ArrayList空值(null)问题

以下为上面文章的总结:
1:下标越界问题

    public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // 是否需要扩容
        elementData[size++] = e;//赋值
        return true;
    }

多个线程进入ensureCapacityInternal()并执行完毕,此时都不需要扩容,依次赋值时会size+1,所以从第二个开始的线程赋值时其下标很可能超过了容量值,赋值时就报错了
2:存入的值变为null
elementData[size++] = e是先赋值再size+1,多线程运行到赋值还没+1时,size位置上被覆盖了多次,然后多次+1,size+1,+2等位置没赋值过,下次就直接从size+n开始赋值,看起来就add了null值一样,此时不会报错,因为add时没有null所以取出时没做考虑就可能报NullPointerException了

解决办法:Collections.synchronizedList(arrayList)获取线程安全的list,使用list.iterator()遍历时最好放在同步块里,原理:说说线程安全包装:Collections.synchronizedList

https://blog.csdn.net/u011418473/article/details/90441061

下面是一个使用多线程调用 RestTemplate 的示例代码: ```java RestTemplate restTemplate = new RestTemplate(); String url = "https://example.com/api/user/{id}"; ExecutorService executor = Executors.newFixedThreadPool(10); List<CompletableFuture<User>> futures = new ArrayList<>(); for (int i = 0; i < 100; i++) { CompletableFuture<User> future = CompletableFuture.supplyAsync(() -> { User user = restTemplate.getForObject(url, User.class, i); return user; }, executor); futures.add(future); } CompletableFuture<Void> allFutures = CompletableFuture.allOf( futures.toArray(new CompletableFuture[0])); allFutures.thenRun(() -> { List<User> users = futures.stream() .map(CompletableFuture::join) .collect(Collectors.toList()); System.out.println("All users: " + users); }); executor.shutdown(); ``` 在这个示例中,我们首先创建了一个 RestTemplate 的实例,并定义了一个请求的 URL,其中 `{id}` 表示需要替换成实际的用户 ID。 接着,我们使用 Executors.newFixedThreadPool 方法创建了一个线程池,其中线程池的大小为 10。然后,我们使用一个 for 循环创建了 100 个 CompletableFuture 对象,每个 CompletableFuture 对象都会在一个单独的线程中执行。在 CompletableFuture 的 Supplier 接口中,我们使用 RestTemplate 发送了一个 GET 请求,并将响应转换成了 User 对象。 接下来,我们使用 CompletableFuture.allOf 方法创建了一个新的 CompletableFuture 对象,它会等待所有的 CompletableFuture 对象都完成后再执行。在 CompletableFuture 完成后,我们使用 stream 和 map 方法将 CompletableFuture 对象转换成 User 对象,并将它们收集到一个 List 中。最后,我们打印所有的 User 对象。 需要注意的是,在使用多线程调用 RestTemplate 时,需要注意线程池的大小和请求的并发量,过大会导致资源浪费,过小会导致请求堆积。另外,如果 RestTemplate 的配置不正确,可能会导致线程阻塞或请求失败,需要进行适当的配置和异常处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值