为什么这个同步的程序返回错误的结果?

埃雷尔·塞加尔-哈列维

为了理解 Java 同步的工作原理,我编写了一个简单的示例程序,该程序使用四个线程计算数组的总和。我知道它不是很有效,但似乎它应该可以工作,因为我使用了锁:

public class ConcurrencyTest1 {

    static Object lock = new Object();
    static volatile int sum;

    public static void main(String[] args) {
        int[] array = new int[40000];
        Arrays.fill(array, 1);

        sum = 0;

        new Thread( ()-> {
            for (int i=0;i<10000;++i)
                synchronized(lock) {
                    sum += array[i];
                }
        } ).start();

        new Thread( ()-> {
            for (int i=10000;i<20000;++i) 
                synchronized(lock) {
                    sum += array[i];
                }
        } ).start();

        new Thread( ()-> {
            for (int i=20000;i<30000;++i) 
                synchronized(lock) {
                    sum += array[i];
                }
        } ).start();

        for (int i=30000;i<40000;++i) 
            synchronized(lock) {
                sum += array[i];
            }

        System.out.println(sum);
    }

}

正确答案是40000。但是,当我多次运行它时,我经常得到更小的数字,例如37713或30000。为什么?

亚当·天行者

您的main程序线程启动 4 个线程,然后打印 sum。它不会等待这些线程完成它们的工作。使其工作的最小更改是:

Thread t1 = new Thread(()-> {
   for (int i=0;i<10000;++i)
      synchronized(lock) {
          sum += array[i];
      }
});
...
t1.start();
....

t1.join();
...
t4.join();

System.out.println(sum);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么这个查询函数返回错误的结果?

为什么这个存储不返回结果

为什么这个程序的结果是这样的?

为什么这个 C 程序显示这个结果?

为什么这个集合返回此错误

为什么这个“else”会返回错误?

为什么这个 C++ 程序在 Code::Blocks 和在线 IDE 之间返回不同的结果?

为什么这个 C++ 素数检查器和夏天返回错误的结果?

为什么这个程序打印出与预期结果相反的结果?

为什么这个用于检查一行是否为回文的程序会返回段错误?

为什么这个 SQL 查询没有返回预期的结果?

为什么这个查询没有返回结果

为什么我的查询返回错误的结果?

为什么Scipy stdDev返回错误的结果?

为什么统计返回错误的结果?

<>或NOT IN,以及查询为什么返回错误结果

为什么我的If条件返回错误结果?

为什么这个简短的C程序的结果为“ 3 2”?

为什么这个Ansi C程序没有给出结果?

为什么这个求和代码的结果是错误的?

为什么这个阶乘函数给出错误的结果?

为什么这个投影会给出错误的结果?

为什么这个简单的 CUDA 内核会得到错误的结果?

为什么这个pojo程序“ readline”总是返回null?

为什么这个BeautifulSoup结果[]?

为什么这个 find 方法返回 None 并抛出错误?

为什么这个MySQL空间查询返回错误的行?

为什么这个asm strcmp()返回错误的值

为什么这个过滤函数返回值错误?