首先 测试 list 在 parallelStream 中使用是否安全 ,上代码
public static void main(String[] args) {
// AtomicReference<List<Integer>> integerAtomicReference = new AtomicReference<>();
List<Integer> objects = new ArrayList<>();
List<Integer> objects1 = new ArrayList<>();
// List<Integer> objects3 = new Vector<>();
// integerAtomicReference.set(objects1);
for (int i = 0; i < 10000; i++) {
objects.add(i);
}
objects.parallelStream()
.forEach(t->{
// integerAtomicReference.
objects1.add(t);
});
for (Integer integer : objects1) {
int b=0;
for (Integer integer1 : objects1) {
if (integer1==integer){
++b;
}
}
if (b>1){
System.out.println(integer);
}
}
System.out.println("size:"+objects1.size());
}
打印结果为
//此处省略打印 行太多了
null
null
null
null
null
size:8747
可以看到 出现null 并且size 也变少了
所以List 在parallelStream中使用是不安全的 , 会出现NULL值 和 丢失数据
那么 AtomicReference在parallelStream中使用呢:
public static void main(String[] args) {
AtomicReference<List<Integer>> integerAtomicReference = new AtomicReference<>();
List<Integer> objects = new ArrayList<>();
List<Integer> objects1 = new ArrayList<>();
// List<Integer> objects3 = new Vector<>();
integerAtomicReference.set(objects1);
for (int i = 0; i < 10000; i++) {
objects.add(i);
}
objects.parallelStream()
.forEach(t->{
// integerAtomicReference.
integerAtomicReference.get().add(t);
});
for (Integer integer : integerAtomicReference.get()) {
int b=0;
for (Integer integer1 : objects1) {
if (integer1==integer){
++b;
}
}
if (b>1){
System.out.println(integer);
}
}
System.out.println("size:"+integerAtomicReference.get().size());
}
打印结果
null
null
null
null
null
null
size:9770
依然是不安全的
最后把 ArrayList 换成 Vector :
public static void main(String[] args) {
// AtomicReference<List<Integer>> integerAtomicReference = new AtomicReference<>();
List<Integer> objects = new ArrayList<>();
// List<Integer> objects1 = new ArrayList<>();
List<Integer> objects3 = new Vector<>();
// integerAtomicReference.set(objects1);
for (int i = 0; i < 10000; i++) {
objects.add(i);
}
objects.parallelStream()
.forEach(t->{
// integerAtomicReference.
objects3.add(t);
});
for (Integer integer : objects3) {
int b=0;
for (Integer integer1 : objects3) {
if (integer1==integer){
++b;
}
}
if (b>1){
System.out.println(integer);
}
}
System.out.println("size:"+objects3.size());
}
多次尝试 线程为安全的:
size:100000