Java並行流誤區(學習筆記探討)

WS_HSY90發表於2020-12-28

在OnJava8第24章並行流討論了一段問題,相關程式碼如下:

public class ParallelStreamCurrent {

    static final Deque<String> TRACE= new ConcurrentLinkedDeque<>();

    static class IntGenerator implements Supplier<Integer>{
        private AtomicInteger current = new AtomicInteger();
        @Override
        public Integer get() {
            TRACE.add(current.get()+":"+ Thread.currentThread().getName());
            return current.getAndIncrement();
        }
    }

    public static void main(String[] args) {
        List<Integer> x = Stream.generate(new IntGenerator()).
                limit(10).
                parallel().
                collect(Collectors.toList());
        System.out.println(x);
        System.out.println(TRACE.toString());
    }
}

其中,parallel()是允許多執行緒呼叫的,也就導致了併發問題,但是current是執行緒安全的AtomicInteger ,按說列印出來的是[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],但是我在ide上怎麼嘗試列印出來都如同這樣的亂數:

 

讓我很是費解,難道AtomicInteger不是執行緒安全的?答案肯定不是,那會是什麼問題呢?大佬的文章這麼說明顯也是實驗下的結果難道有什麼誤解?望有知道的大佬給予解答,感謝!

相關文章