A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

版权声明:本文为博主原创文章,未经博主允许不得转载。        https://blog.csdn.net/zsz459520690/article/details/51957874
import java.util.ArrayList;
import java.util.List;

/**
* <p></p>
*
* @author zhongzhong
* @since 0.1.0
*/
public class Test {
    public static void main(String[] args) {
        List<String> jobs = new ArrayList<>();
        for(int i=0;i<1000;i++){
            jobs.add("job-"+i);
        }
        Person person = new Person();
        for(int i=0;i<100;i++) {
            jobs.parallelStream().forEach(job ->
                    person.getJobs().add(job)
            );
            System.out.println(person.getJobs().size());
            person.getJobs().clear();
        }
    }
}
class Person{
    private List<String> jobs=new ArrayList<>();

    public List<String> getJobs() {
        return jobs;
    }

    public void setJobs(List<String> jobs) {
        this.jobs = jobs;
    }
}

1000 1000 1000 1000 1000 997 1000 1000 1000 1000 1000 970 877 678 685 766 765 855 832 789 790 858 778 909 1000 904 767 919 793 913 868 804 1000 732 777 817 721 796 761 746 848 1000 738 795 811 750 905 776 771 819 876 861 900 926 806 773 755 760 821 910 856 835 728 807 824 941 822 825 940 834 822 1000 820 1000 1000 779 988 854 837 801 584 696 964 987 981 802 768 765 796 843 898 898 717 740 630 662 853 910 662 644

会发现输出的list的大小都不一样,这就是没有注意到并行流的问题。

将Person类中的

jobs声明改成如下语句就行了,这是因为ArrayList本身不是线程安全的。
private List<String> jobs=Collections.synchronizedList(new ArrayList<>());




---------------------
【转载】
作者:我是钟钟
原文:https://blog.csdn.net/zsz459520690/article/details/51957874


4 个回复

倒序浏览
ヾ(◍°∇°◍)ノ゙
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马