在使用java8并行流的时候的一点问题

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<>());





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值