当前位置: 代码迷 >> J2SE >> 加法多线程,该如何处理
  详细解决方案

加法多线程,该如何处理

热度:402   发布时间:2016-04-24 18:04:15.0
加法多线程
我有两个文件:AddThread.java进行加法操作。Core.java是主线程文件。得到的结果sum = 10. 可是我觉得应该得到20才对呀。
Java code
package Threads;public class AddThread implements Runnable{    private volatile static int sum = 0;    public AddThread(){            }        public void run(){        {            for(int i = 0;i<10;++i){                int temp = sum;                temp = temp +1;                try{                    Thread.sleep(20);                }catch(InterruptedException e){                    System.out.println(e);                }                sum = temp;                System.out.println("This sum is "+ sum);            }        }    }        public static int getSum(){        return sum;    }}

Java code
package Threads;public class Core {    public static void main(String[] args){        AddThread first = new AddThread();        AddThread second = new AddThread();                Thread one = new Thread(first);        Thread two = new Thread(second);        one.setName("firstThread");        two.setName("secondThread");                one.start();        two.start();                while(one.isAlive()||two.isAlive()){                    }                System.out.println(AddThread.getSum());            }}



------解决方案--------------------
你这个程序不同步,得到的结果是随机的
比如,线程one先执行int temp = sum; 此时tmep=0,sum=0,之后,假设线程一直没有被系统分配CPU,那么线程tow就一直执行直到结束,此时,sum=10,好了,这回系统把CPU分配给线程one,线程one继续执行后面的代码(注意线程one的temp是0),然后temp=temp+1,temp是1,然后sum=temp,sum是1,这样一直到线程one结束,结果sum=10

------解决方案--------------------
synchronized是同步
volatile貌似只是让变量在堆和栈之间的同步而已,不是线程的同步
------解决方案--------------------
volatile只是一个线程修改了该值,其他线程能够立刻看到该值的改变,并不能达到同步的效果。
------解决方案--------------------
探讨

volatile只是一个线程修改了该值,其他线程能够立刻看到该值的改变,并不能达到同步的效果。
  相关解决方案