java - 为什么这里的主线程不等待t2?在这里,输出始终大于20000,但不一致

标签 java multithreading

package org.multithreading.basics;

public class ThreadJoin {

    public static void main(String[] args) {

        Counter counter = new Counter();

        Thread t1 = new Thread(counter);
        Thread t2 = new Thread(counter);

        t1.start();
        t2.start();

        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Numbers counted =" + counter.getCount());
    }

}

class Counter implements Runnable {

    private int count;

    @Override
    public void run() {

        for (int i = 0; i < 20000; i++) {
            count++;
        }

    }

    public int getCount() {
        return count;
    }

}

在此,输出始终为> 20000和<40000,并且始终为随机值。因此,在上面的代码中,主联接正在等待t1完成,但是为什么不等待t2,尽管联接在t1和t2上都存在。

最佳答案

该代码等待两个线程完成,将执行4000个++语句!

但是您需要了解线程如何工作,它们的变量访问如何工作,volatile和非 volatile 变量是什么,同步如何工作,它们为什么不同以及为什么您看到的结果是完全合理的并且是100%期望的。
x++基本上是x = x + 1(这不是一个精确的解释,但是这里发生的一般情况)=>如果两个线程同时运行该语句,则由于两个都读取x = 123,都调用123 + 1 => 124,然后您将丢失一个增量。都将124分配给x =>调用了两个增量,但是该值仅增加了一个。

关于java - 为什么这里的主线程不等待t2?在这里,输出始终大于20000,但不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59488545/

相关文章:

java - 如何将 MySQL 查询的结果映射到 java 模型类?

c++ - boost asio async_read 中的随机 EOF

c++ - 具有两个线程的段错误逻辑

java - 根据时间限制运行线程

java - 如何在 Play Framework 上模拟curl --data 'some_content=xyz'?

java - 当有颜色时 XSSFColor.getRgb() 返回 null

java - 如何动态设置ImageResource?

java - Spring 国际化 : How to dynamically set locale value

c++ - 在 openmp 中使用不同线程组装 vector 时缩放比例不佳

c++ - 关于 pthread_cond_wait?