for循环里添加异步方法,往异步方法里传入List,在异步方法中深拷贝一份传入的List,然后set到ThreadLocal中,for循环在ThreadLocal取值,会出现获取的值重复
时间: 2024-03-11 16:04:48 浏览: 84
这个问题的原因是多个异步方法共用了同一个ThreadLocal,导致在其中一个异步方法中修改ThreadLocal的值会影响到其他异步方法。解决这个问题的方法是为每个异步方法都创建一个新的ThreadLocal实例,这样每个异步方法都有自己独立的ThreadLocal实例,就不会相互干扰了。具体的实现方法可以使用ThreadLocal的withInitial方法,在创建ThreadLocal实例的时候为其指定一个初始化函数,该函数会在第一次访问该ThreadLocal实例时被调用,可以在该函数中创建一个新的List并返回。例如:
```
private static ThreadLocal<List<Object>> threadLocal = ThreadLocal.withInitial(ArrayList::new);
public static void asyncMethod(List<Object> list) {
List<Object> copyList = new ArrayList<>(list);
threadLocal.set(copyList);
CompletableFuture.runAsync(() -> {
List<Object> threadList = threadLocal.get();
// do something with threadList
});
}
```
在上面的代码中,我们使用了withInitial方法为ThreadLocal实例创建了一个初始化函数,该函数返回一个新的ArrayList实例。在异步方法中,我们首先深拷贝了传入的List,然后将其set到ThreadLocal中,这样在异步方法中就可以获取到独立的List实例了。在异步方法中,我们通过threadLocal.get()方法获取到ThreadLocal中保存的List实例来进行操作。
阅读全文
相关推荐















