1. 程式人生 > >在使用java8並行流的時候的一點問題

在使用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<>());