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