Java 执行递增线程后,变量始终相同

Java 执行递增线程后,变量始终相同,java,multithreading,Java,Multithreading,我试图理解线程。 我写了一个简单的程序 公共类主{ 静态整数计数器=0; 公共静态void main(字符串[]args)引发InterruptedException{ 线程t1=新线程(()->{ 对于(int i=0;i{ 对于(int i=0;i

我试图理解线程。 我写了一个简单的程序

公共类主{
静态整数计数器=0;
公共静态void main(字符串[]args)引发InterruptedException{
线程t1=新线程(()->{
对于(int i=0;i<1000;i++){
计数器++;
}
});
线程t2=新线程(()->{
对于(int i=0;i<1000;i++){
计数器++;
}
});
t1.start();
t2.start();
t1.join();
t2.连接();
系统输出打印项次(计数器);
}
}
结果总是2000,但我不知道为什么。任何run方法都没有同步,所以为什么它总是给我相同的结果

如果我写:

 t1.start();
        t1.join();
        System.out.println(counter);
        t2.start();
        System.out.println(counter);

然后我得到了结果:10001000。为什么它总是等于1000?

您的循环非常短,以至于
t1
t2
开始之前就结束了。试试10万吧。缺少同步并不保证您会有并发问题,但正确地合并同步将阻止这些问题

结果总是2000,但我不知道为什么

因为您很幸运,两个线程之间没有任何竞争条件。仅仅因为比赛条件可能发生并不意味着它一定会发生

为什么它总是等于1000


因为第二次打印计数器时,第二个线程尚未执行。或者因为它已经执行了,但是由于缺少同步而没有可视性保证,主线程仍然可以看到最新的值。

什么是downvote的原因?我不知道!我完全理解你的要求。@pipilam这是stackOverflow的常见现象。拿我来说,结果总是2000,但我不知道为什么——纯粹是运气,没别的。在java-12上第一次运行时,我立即得到了低于2000的结果。@Eugene我总是得到2000,这就是为什么我问:PFair够了。正确的术语是什么?“幸运的是,没有丢失增量来显示竞争条件”会更正确吗?就像你的评论一样,很好,很精确。我喜欢!