parallelStream线程安全问题的处理
1.1、实例(传统方法)
package com.asia.tip;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class TestParallelStream {
@Test
public void hao() {
List<Integer> list=new ArrayList<Integer>();
for(int i=0;i<1000;i++) {
list.add(i);
}
List<Integer> newList=new ArrayList<Integer>();
list.parallelStream().forEach(s->{
newList.add(s);
});
System.out.println(newList.size());
}
}
运行结果不稳定,可能是939或异常
1.2、实例(新方法)
@Test
public void hao2() {
List<Integer> list = new ArrayList<Integer>();
IntStream.rangeClosed(1, 1000).parallel().forEach(i -> {
list.add(i);
});
System.out.println("new method:"+list.size());
}
运行结果:
new method:970
2.1、解决parallelStream线程安全问题方案一:使用同步代码块
@Test
public void hao3() {
List<Integer> list = new ArrayList<Integer>();
Object o=new Object();
IntStream.rangeClosed(1, 1000).parallel().forEach(i -> {
synchronized (o) {
list.add(i);
}
});
System.out.println("使用同步代码锁:"+list.size());
}
2.2、解决parallelStream线程安全问题方案二:使用线程安全的集合
@Test
public void hao4() {
Vector<Integer> v=new Vector<Integer>();
IntStream.rangeClosed(1, 1000).parallel().forEach(i -> {
v.add(i);
});
System.out.println("使用线程安全的集合:"+v.size());
}
2.3、解决parallelStream线程安全问题方案三:转成synchronizedList
@Test
public void hao5() {
List<Integer> list = new ArrayList<Integer>();
List<Integer> synchronizedList = Collections.synchronizedList(list);
IntStream.rangeClosed(1, 1000).parallel().forEach(i -> {
synchronizedList.add(i);
});
System.out.println("转synchronizedList集合:" + synchronizedList.size());
}
2.4、解决parallelStream线程安全问题方案三:调用Stream流的collect/toArray
@Test
public void hao6() {
List<Integer> collect = IntStream.rangeClosed(1, 1000).parallel().boxed().collect(Collectors.toList());
System.out.println("collect收集:" + collect.size());
Object[] array = IntStream.rangeClosed(1, 1000).parallel().boxed().toArray();
System.out.println("toArray收集:" + array.length);
}