java多线程问题 我很好奇这两个结果是怎么运行出来的,我知道产生这种结果差异的原因在红线出。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java多线程问题 我很好奇这两个结果是怎么运行出来的,我知道产生这种结果差异的原因在红线出。相关的知识,希望对你有一定的参考价值。
首先,因为这里的两个线程里面传的都是同一个c对象,而c里面调用add的,只有一个bank对象,所以sum对两个线程是共享的。
当一个线程运行完红线内的第一个语句,没来得及打印,被另一个线程抢先,另一个线程传入num值100的时候,sum已经是100了,那么第二个线程打印200,我能理解。但是虽然sum值是共享的,但是第一个线程在被赶超的时候肯定是已经执行完红线内第一个语句的,那么接着第一个执行红线的线程肯定应该是打印100呀,怎么还会再打印一次200呢?
线程是同时进行的,不是像你控制台打印时的顺序那样运行的,首先知道线程运行原理,再知道线层安全问题
追问那按你说的,第一个线程值传进来还没累加,那么第二个线程第一次开始累加前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多线程问题 我很好奇这两个结果是怎么运行出来的,我知道产生这种结果差异的原因在红线出。的主要内容,如果未能解决你的问题,请参考以下文章