【问题标题】:I don't get how threads work in this case我不明白在这种情况下线程是如何工作的
【发布时间】:2018-11-02 00:41:36
【问题描述】:

下面的代码显示了线程中没有竞争条件是如何工作的,但我没有得到同步和不同步之间的区别。我以为静态变量计数器无论如何都会被添加到 20000,但事实证明,没有同步计数器会小于 20000。你能解释一下在这种情况下线程是如何工作的吗?另外,在Java中,线程实际上不是“并发”运行,而是轮流运行一段时间吗?

public class NoRaceCondition implements Runnable {
    private static int counter = 0;
    private static Object gateKeeper = new Object();

    public static void main(String[] args) {
        Thread t1 = new Thread(new NoRaceCondition());
        Thread t2 = new Thread(new NoRaceCondition());
        t1.start();
        t2.start();
        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) { e.printStackTrace(); }
        System.out.printf("counter = %d\n", counter);
    }

    public void run() {
        synchronized (gateKeeper) {
            for (int i = 0; i < 10000; i++) {
                {
                    counter++;
                }
            }
        }
    }
}

【问题讨论】:

    标签: java multithreading concurrency


    【解决方案1】:

    您可以将count++ 视为 3 个独立的步骤。

    1. 读取count的值
    2. 增加值
    3. 用新的增量值覆盖count

    当多个线程同时执行上述步骤时,可能会出现竞态条件。竞争条件的 1 个示例是

    count = 1

    假设有 2 个线程分别命名为 AB

    线程A读取count的值,得到1

    线程B读取count的值,得到1

    线程 A 增加它的值并得到 2

    线程 B 增加它的值并得到 2

    线程 A 将值写入count

    count 现在是 2

    线程 B 将值写入count

    count 现在再次为 2,而在 2 次增量后预计为 3

    【讨论】:

      猜你喜欢
      • 2020-04-16
      • 2020-08-20
      • 1970-01-01
      • 1970-01-01
      • 2019-12-28
      • 2016-12-05
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      相关资源
      最近更新 更多