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 之间的任意位置。所以看起来它不是线程安全的。有人可以解释为什么这不是线程安全的吗?
最佳答案
您没有等待任务的执行。您的流将任务移交给池,然后立即打印出计数器的当前(即非最终)值。计数器正确递增,但您过早询问其值。在系统输出之前,您必须等待执行程序完成。
阅读this answer关于 shutdown()
和 awaitTermination()
的使用。
关于java - 为什么这段代码不是线程安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47024959/