在这种情况下,我不知道线程如何工作

时间:2018-11-02 00:41:37

标签: java multithreading concurrency

以下代码显示了线程中没有竞争条件的工作原理,但是同步和不同步都没有区别。我认为静态变量计数器无论如何都将添加到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++;
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

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

  1. 读取count的值
  2. 增加价值
  3. 使用新的递增值覆盖count

当多个线程同时执行上述步骤时,可能会出现竞争条件。种族条件的一个例子是

  

count = 1

     

让两个线程分别名为AB

     

线程A读取count的值并获得1

     

线程B读取count的值并获得1

     

线程A的值递增并获得2

     

线程B的值递增并获得2

     

线程A将值写入count

     

count现在是2

     

线程B将值写入count

     

count现在又变为2了,它预期在2增量后为3