for循环里添加异步方法,往异步方法里传入List,在异步方法中深拷贝一份传入的List,在异步方法的类中初始化一个ThreadLocal,然后set到ThreadLocal中,for循环在ThreadLocal中取值,会出现获取的值重复
时间: 2023-08-11 11:40:06 浏览: 122
在for循环中依次执行异步操作
这个问题可能是由于ThreadLocal的使用不正确导致的。ThreadLocal是一种多线程编程技术,可以在多线程环境下保证数据的独立性。它的主要作用是为每个线程提供一个独立的变量副本,线程之间互不干扰。
在你的问题中,可能出现的原因是在for循环中每次都会调用异步方法,而异步方法中又会初始化一个ThreadLocal并将深拷贝的List存储到ThreadLocal中。由于每次调用异步方法都会初始化一个新的ThreadLocal,并将新的List存储到其中,因此在for循环中取值时会出现获取的值重复的情况。
为了解决这个问题,你可以将ThreadLocal的初始化放到异步方法外部,这样就可以保证所有异步方法共用同一个ThreadLocal。同时,你可以将List作为ThreadLocal的初始值,这样可以避免在异步方法中深拷贝List。
示例代码如下:
```
// 初始化ThreadLocal
ThreadLocal<List<Object>> threadLocal = ThreadLocal.withInitial(() -> new ArrayList<>());
for (Object obj : objList) {
// 调用异步方法
CompletableFuture.runAsync(() -> {
// 在异步方法中获取ThreadLocal中的List
List<Object> list = threadLocal.get();
// 进行一些操作
...
});
}
```
这样做可以保证所有异步方法共用同一个ThreadLocal,避免了获取值重复的情况。另外,由于ThreadLocal的初始值是一个空的List,因此在异步方法中不需要进行深拷贝操作。
阅读全文