关于parallelStream()引发线程不安全问题

一、问题代码

public class ParallelStreamTest {
    public static void main(String[] args) {
        List<DataA> dataAList  =new ArrayList<>();
        List<DataB> dataBList = new ArrayList<>();
        for (int i = 0; i <5 ; i++) {
            DataA a = new DataA();
            if (i>3){
                a.setId("111");
            }else {
                a.setId("222");
            }
            dataAList.add(a);
        }

        for (int i = 0; i <100 ; i++) {
            DataB b = new DataB();
            if (i>50){
                b.setId("111");
            }else {
                b.setId("222");
            }
            dataBList.add(b);
        }

        List<DataC> dataCList = getDataC(dataAList,dataBList);
        System.out.println(dataCList.toString());

    }

    private static List<DataC> getDataC(List<DataA> dataAList, List<DataB> dataBList){
        List<DataC> dataCList = new ArrayList<>();
        dataBList.parallelStream().forEach(b->{
            DataA a =  dataAList.parallelStream().filter(aa->aa.id.equals(b.id)).findFirst().orElse(new DataA());
            DataC c = new DataC();
            c.setId(a.id);
            dataCList.add(c);
        });
        return dataCList;

    }

    static class DataA{
        private String id;

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }
    }

    static class DataB{
        private String id;

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }
    }

    static class DataC{
        private String id;

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }
    }
}

二、执行结果

 

每次执行结果不统一

三、解决办法

 private static List<DataC> getDataC(List<DataA> dataAList, List<DataB> dataBList){
        List<DataC> dataCList = new ArrayList<>();
        dataBList.forEach(b->{
            DataA a =  dataAList.stream().filter(aa->aa.id.equals(b.id)).findFirst().orElse(new DataA());
            DataC c = new DataC();
            c.setId(a.id);
            dataCList.add(c);
        });
        return dataCList;

    }

去掉parallelStream()每次执行结果一致

发布了170 篇原创文章 · 获赞 64 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/hy_coming/article/details/104972465