java - 为什么这个 java 程序中没有竞争条件

标签 java multithreading

<分区>

我正在学习多线程并想编写一些具有竞争条件的代码。但是这些代码不起作用:我已经多次运行代码,但它总是打印 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) {
        }
    }
    // will always print 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();
    }
}

最佳答案

因为您的程序中没有线程,幸运的是顺序程序没有竞争问题。您调用 thread.run 调用 run 方法并且不启动任何线程。使用 thread.start 来启动一个线程。

关于java - 为什么这个 java 程序中没有竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35437565/

相关文章:

java - 如何在 Java 中打乱对象数组

java - setOnEditorActionListener() 方法不适用于输入类型 textMultiline 以及键盘中的输入按钮

java - 如何在java中执行 'cd'命令然后执行linux命令

objective-c - 如何在 Objective C 中安排方法调用

java - 我正在尝试了解java和多线程中的Singleton类

c++ - C , C++ 非同步线程返回一个奇怪的结果

iphone - 具有多个参数的 performSelectorOnMainThread

java - 写入并保存文件并打开它

java - ANTLR:有一个简单的例子吗?

c - 使用 OpenSSL C 库在多线程中生成椭圆曲线 key 对 (EC_KEY_generate_key)