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<>());
在使用java8并行流的时候的一点问题
最新推荐文章于 2023-08-06 21:37:27 发布