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

标签 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 之间的任意位置。所以看起来它不是线程安全的。有人可以解释为什么这不是线程安全的吗?

最佳答案

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

阅读this answer关于 shutdown()awaitTermination() 的使用。

关于java - 为什么这段代码不是线程安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47024959/

相关文章:

java - 无法在分配了 ToolTipText 的选项卡之间切换 (JTabbedPane)

c# - Parallel.ForEach 改变多个线程的行为

C++ 多线程、简单的消费者/生产者线程、后进先出、通知、计数器

c# - 在 C# 上使用多线程的问题

concurrency - Goroutine 和 for 循环

c++ - 系统范围的热键快捷方式(Windows/Qt) : Prevent window lock?

java - 如何用 Java 设置客户端/服务器?

java - 如何在Android应用程序中使用Oovoo SDK?

java - 实现自定义 Java 屏障

java - 如何从特定页面或类似页面上的命令行打开Word文档