java多线程问题 我很好奇这两个结果是怎么运行出来的,我知道产生这种结果差异的原因在红线出。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java多线程问题 我很好奇这两个结果是怎么运行出来的,我知道产生这种结果差异的原因在红线出。相关的知识,希望对你有一定的参考价值。

首先,因为这里的两个线程里面传的都是同一个c对象,而c里面调用add的,只有一个bank对象,所以sum对两个线程是共享的。
当一个线程运行完红线内的第一个语句,没来得及打印,被另一个线程抢先,另一个线程传入num值100的时候,sum已经是100了,那么第二个线程打印200,我能理解。但是虽然sum值是共享的,但是第一个线程在被赶超的时候肯定是已经执行完红线内第一个语句的,那么接着第一个执行红线的线程肯定应该是打印100呀,怎么还会再打印一次200呢?

线程安全的问题,就是当你的第一个线程在给sum传值时还没有进行累加,而第二个线程用时在累加中,第一个线程还没累加赋值给变量,第二个线程所以累加的值没第一个线程累加的值追答

线程是同时进行的,不是像你控制台打印时的顺序那样运行的,首先知道线程运行原理,再知道线层安全问题

追问

那按你说的,第一个线程值传进来还没累加,那么第二个线程第一次开始累加前sum仍然是初始值0,第二线程执行完第一次应该打印100才对,怎么会打印200呢

追答

这个你不用纠结,就是线程安全问题,所以会出现不合常理的数据,在java中叫脏数据,你只需改一行代码就能解决

在add方法的void前加上synchronized

参考技术A 你也说了,没来得及打印
再轮到它打印的时候,sum已经是200了,怎么还会打100?追问

但是先进来的线程已经执行完sum=sum+num了,只是等着打印,难道第二个线程执行完这个语句打印后,第一个语句还会回去读一遍sum等于多少吗
那又假如按你所说,第二个线程进来将将sum值变成了200,第一个线程反正只负责吧 sum值打出来,这样肯定就是再打一次200。但是我多执行几遍这个代码,又出现了上图第二种结果,第一个打出200,第二个打出100,又怎么会打出100来呢

追答

是到打印的语句执行那一刻,才去读取sum值的,你的理解有误。
读取的那一瞬间,是100就读到100,是200就读200,语句是顺序执行,不会回头执行的。

以上是关于java多线程问题 我很好奇这两个结果是怎么运行出来的,我知道产生这种结果差异的原因在红线出。的主要内容,如果未能解决你的问题,请参考以下文章

JAVA-初步认识-第十二章-多线程运行图解

android AsyncTask 怎么返回值给UI线程

多线程程序,当一条原子指令刚执行一半的时候,CPU时间片耗尽,此时是立刻切换线程吗?

Java线程池在运行后的结果反查

java中请问如何等待一个线程结束在运行其他的代码?

Java多线程-线程安全问题