您的位置:首页 > 编程语言 > Java开发

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

2016-07-19 17:32 471 查看
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<>());
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: