为什么这段代码不是线程安全的?

时间:2017-10-30 22:08:13

标签: java multithreading concurrency java-8

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.IntStream;

public class Synchronized{
    public static AtomicInteger count = new AtomicInteger(0);
    public static synchronized void increment() {
        count.incrementAndGet();
    }
    public static void main(String[] args) {
        ExecutorService exector = Executors.newFixedThreadPool(2);
        IntStream.range(0, 1000).forEach( i -> exector.submit(Synchronized:: increment));
        System.out.println(count.get());    
    }
}

最后不打印1000。它的打印范围从600到1000。所以看起来它不是线程安全的。有人可以解释为什么这不是线程安全吗?

1 个答案:

答案 0 :(得分:2)

您不是在等待执行任务。您的流正在将任务交给池,然后立即打印出您的计数器的当前(即非最终)值。计数器正常递增,但您过早地询问其值。您必须等待执行程序在sysout之前完成。

关于shutdown()awaitTermination()的使用情况,请阅读this answer