日期:2014-05-20  浏览次数:20704 次

加法多线程
我有两个文件: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只是一个线程修改了该值,其他线程能够立刻看到该值的改变,并不能达到同步的效果。