当前位置: 首页 > 知识库问答 >
问题:

为什么这个java程序中没有竞争条件[重复]

宰父才
2023-03-14

我正在学习多线程,想写一些与竞争条件的代码。然而,这些代码不起作用:我已经运行了很多次代码,但它总是打印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();
    }
}

共有1个答案

刘畅
2023-03-14

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

 类似资料:
  • 9.1. 竞争条件 在一个线性(就是说只有一个goroutine的)的程序中,程序的执行顺序只由程序的逻辑来决定。例如,我们有一段语句序列,第一个在第二个之前(废话),以此类推。在有两个或更多goroutine的程序中,每一个goroutine内的语句也是按照既定的顺序去执行的,但是一般情况下我们没法去知道分别位于两个goroutine的事件x和y的执行顺序,x是在y之前还是之后还是同时发生是没法

  • 9.6. 竞争条件检测 即使我们小心到不能再小心,但在并发程序中犯错还是太容易了。幸运的是,Go的runtime和工具链为我们装备了一个复杂但好用的动态分析工具,竞争检查器(the race detector)。 只要在go build,go run或者go test命令后面加上-race的flag,就会使编译器创建一个你的应用的“修改”版或者一个附带了能够记录所有运行期对共享变量访问工具的tes

  • 问题内容: 如何停止MySQL中的竞争条件?当前的问题是由一个简单的算法引起的: 从表中选择一行 如果不存在,将其插入 然后会得到重复的行,或者如果您通过唯一/主键阻止它,则会出现错误。 现在,通常我认为事务在这里有所帮助,但是由于该行不存在,所以事务实际上并没有帮助(或者我是否错过了什么?)。 LOCK TABLE听起来有些矫kill过正,尤其是如果该表每秒更新多次。 我唯一想到的其他解决方案是

  • 问题内容: 我有一个订单队列,可通过存储过程由多个订单处理器访问。每个处理器传递一个唯一的ID,该ID用于锁定接下来的20个订单以供自己使用。然后,存储过程将这些记录返回给要处理的订单处理器。 在某些情况下, 多个处理器能够检索相同的“ OrderTable”记录 ,此时它们将尝试同时对其进行操作。这最终会导致在该过程的后期引发错误。 我的下一个动作是允许每个处理器抓住所有可用的订单,然后对处理器

  • 问题内容: 我有几个工作人员,每个工作人员都拥有与PostgreSQL的连接。工人用不同的桌子操纵。 工作人员处理来自系统外部的并行请求。被访问的表之一是用户表。当收到一些信息时,我首先需要确保表中有该用户的记录。如果没有记录,我希望首先创建一个。 我正在使用以下成语: 的代码是: 然后测试是否返回任何行。 的(简化)代码为: 当我的系统处理与 同一 用户有关 的 不同信息的并行流时,我经常会收到