在使用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<>());
相关文章推荐
- @Async in Spring--转
- Java volatile关键字详解
- Java单例你所不知道的事,与Volatile关键字有染
- Java集合(6):TreeSet
- 10045---Java中的值传递和引用传递
- Java程序内存分析:使用mat工具分析内存占用
- 关于Android Studio打包jar,aar,Eclipse依赖library问题
- java使用cookie和session
- Spring 中classPath:用法
- java 获取系统中默认的编码
- 使用Spring JDBCTemplate简化JDBC操作
- 【Eclipse】部署新项目的几个出错问题与解决方案
- AndroidStudio 与Eclipse快捷键对比
- Java JDBC的基本知识
- Java 中正确使用 hashCode 和 equals 方法
- Java Socket编程
- SpringMVC 的数据绑定
- im4java+GraphicsMagick图片处理
- 搭建Spring所需的各类jar包汇总详解
- 使用SpringAop 验证方法参数是否合法