为什么这个Java程序中没有竞态条件

14 浏览
0 Comments

为什么这个Java程序中没有竞态条件

我正在学习多线程,并希望编写一些存在竞态条件的代码。然而,这些代码并没有起作用:我已经运行了代码多次,但它总是打印出10,这是没有竞态条件的正确结果。有人可以告诉我为什么吗?谢谢。

以下是主函数的内容。它将创建10个线程来修改一个静态变量,并在最后打印出该变量的值。

public static void main(String[] args) {
    int threadNum = 10;
    Thread[] threads = new Thread[threadNum];
    for (int i = 0; i < threadNum; i++) {
        threads[i] = new Thread(new Foo());
    }
    for (Thread thread : threads) {
        thread.run();
    }
    for (Thread thread : threads) {
        try {
            thread.join();
        } catch (InterruptedException e) {
        }
    }
    // 总是打印10
    System.out.println(Foo.count);
}

以下是Foo类的定义:

class Foo implements Runnable {
    static int count;
    static Random rand = new Random();
    void fn() {
        int x = Foo.count;
        try {
            Thread.sleep(rand.nextInt(100));
        } catch (InterruptedException e) {
        }
        Foo.count = x + 1;
    }
    @Override
    public void run() {
        fn();
    }
}

0
0 Comments

这个Java程序中没有出现竞争条件(race condition)的原因是因为程序中没有使用线程(threads),而且幸运的是,顺序执行的程序不会出现竞争问题。在程序中,你调用了 thread.run 方法,它会调用 run 方法,但不会启动任何线程。要启动一个线程,应该使用 thread.start 方法。

非常感谢!在我使用 thread.start 之后,程序运行正常了。

0