【问题标题】:Why this code is not thread-safe? [duplicate]为什么这段代码不是线程安全的? [复制]
【发布时间】:2018-04-12 00:08:19
【问题描述】:
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 的任何位置。所以看起来它不是线程安全的。有人可以解释为什么这不是线程安全的吗?

【问题讨论】:

  • 你似乎没有加入/等待任何地方。
  • 在打印出结果之前,您不会等待执行者完成他们的工作

标签: java multithreading concurrency java-8


【解决方案1】:

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

阅读this answer 了解shutdown()awaitTermination() 的使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 2011-05-18
    相关资源
    最近更新 更多