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。所以看起来它不是线程安全的。有人可以解释为什么这不是线程安全吗?
答案 0 :(得分:2)
您不是在等待执行任务。您的流正在将任务交给池,然后立即打印出您的计数器的当前(即非最终)值。计数器正常递增,但您过早地询问其值。您必须等待执行程序在sysout之前完成。
关于shutdown()
和awaitTermination()
的使用情况,请阅读this answer。