- 避免问题的方法:
- 使用同步集合:将
ArrayList
转换为同步集合,如Collections.synchronizedList
,这样在多线程环境下对集合的操作会被同步。
- 使用线程安全的集合:例如
CopyOnWriteArrayList
,它在修改操作时会创建一个新的底层数组,读操作基于旧数组,从而实现读写分离,保证线程安全。
- 使用并行流时的同步机制:如果使用并行流,需要使用
Atomic
类型或同步块来确保对元素的修改是线程安全的。
- 示例代码:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
public class SynchronizedListExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
List<String> synchronizedList = Collections.synchronizedList(list);
synchronizedList.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
}
}
- 使用线程安全的集合(CopyOnWriteArrayList):
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;
public class CopyOnWriteArrayListExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
List<String> copyOnWriteList = new CopyOnWriteArrayList<>(list);
copyOnWriteList.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
}
}
- 使用并行流时的同步机制(以
Atomic
类型为例):
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
public class ParallelStreamSyncExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
AtomicInteger index = new AtomicInteger(0);
List<String> result = list.parallelStream()
.map(s -> {
int i = index.getAndIncrement();
// 这里可以进行基于索引的同步操作
return s.toUpperCase();
})
.collect(Collectors.toList());
}
}