在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不是线程安全的?答案肯定不是,那会是什么问题呢?大佬的文章这么说明显也是实验下的结果难道有什么误解?望有知道的大佬给予解答,感谢!