for循环里添加异步方法,往异步方法里传入List,在异步方法中循环传入的List,然后把list放到ThreadLocal中,然后在从ThreadLocal中获取值进行循环会出现获取的值重复,list为引用类型
时间: 2024-03-21 14:42:56 浏览: 90
这是因为线程在执行异步方法时,可能会被操作系统调度,导致异步方法执行顺序不一定按照代码顺序执行。因此,在异步方法中修改ThreadLocal的值可能会被其他线程看到,从而导致获取的值重复。
为了解决这个问题,可以将List复制一份,再将复制后的List放入ThreadLocal中。这样,在异步方法中修改ThreadLocal的值不会影响其他线程的操作。
示例代码如下:
```
List<String> list = new ArrayList<>();
ThreadLocal<List<String>> threadLocal = new ThreadLocal<>();
for (int i = 0; i < 10; i++) {
list.add("item" + i);
}
for (int i = 0; i < 10; i++) {
int index = i;
CompletableFuture.runAsync(() -> {
List<String> copyList = new ArrayList<>(list);
threadLocal.set(copyList);
for (String item : copyList) {
// do something
}
threadLocal.remove();
});
}
```
这样,在异步方法中循环的是复制后的List,而不是原始的List,就不会出现获取的值重复的问题了。
阅读全文