大侠们,帮忙看一下这段java程序,为什么每次运行输出结果不同?

class CBank
{ private static int sum=0;
public static void add(int n){
int tmp=sum;
tmp=tmp+n; // 累加汇款总额
try{
Thread.sleep((int)(10000*Math.random())); // 小睡几秒钟
}
catch(InterruptedException e){}
sum=tmp;
System.out.println("sum= "+sum);
}
}

class CCustomer extends Thread // CCustomer类,继承自Thread类
{ public void run(){ // run() method
for(int i=1;i<=3;i++)
CBank.add(100); // 将100元分三次汇入
}
}

public class Ex6_1
{ public static void main(String args[])
{ CCustomer c1=new CCustomer();
CCustomer c2=new CCustomer();
c1.start();
System.out.println("The second");
c2.start();
}
}

class CBank
{ private static int sum=0;
public static void add(int n){
int tmp=sum;
tmp=tmp+n; // 累加汇款总额
try{
Thread.sleep((int)(10000*Math.random())); // 小睡几秒钟
}catch(InterruptedException e){}
/*
这里造成的,因为小睡几秒了,第一次读出来tmp=0,加上100后变为100,小睡的时候tmp为100,sum为0,第二个线程tmp=sum的时候,此时
sum的值可能是0也可能是第一个线程sum=tmp后的100,依次类推,所以小睡的时间不同,结果有所不同。总之,是因为sum这个静态变量的不
同步造成的。
*/
sum=tmp;
System.out.println("sum= "+sum);
}
}

class CCustomer extends Thread // CCustomer类,继承自Thread类
{ public void run(){ // run() method
for(int i=1;i<=3;i++)
CBank.add(100); // 将100元分三次汇入
}
}

public class Ex6_1
{ public static void main(String args[])
{ CCustomer c1=new CCustomer();
CCustomer c2=new CCustomer();
c1.start();
System.out.println("The second");
c2.start();
}
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-10-31
两个线程 c1 c2 谁先抢到资源 就先输出谁的吧?
所以每次输出都是不一样的

话又说回来 我怎么每次输出的都是一个结果呢?
郁闷
第2个回答  2012-03-27
1、CBank没有实例化,需要在 for外 CBank cbank = new CBank();在for内cbank.add(100);
2、private static int sum 要么改成 public,要么增加 get、set方法;
或许第二个不是必须的,是我个人的习惯追问

请问又为什么要进行异常检测呢?

第3个回答  2012-03-27
Thread.sleep((int)(10000*Math.random())); // 小睡几秒钟
这句话影响的

java新手,大侠能否解释下为什么第一次是ture而第二次为false
int3和int4显然分别开辟了内存地址,地址肯定不同。所以就false了

各位大侠帮帮忙,帮我解释一下这道题,打印输出结果是5,因为数据溢出了...
你的写法有问题,java 中的long赋值需要写 final long a=24*60*1000*1000L;必须在后面加个L

请大侠们把这个填 上,谢谢,java程序
1 : sum=4950.0 2 : 12 i=3 3 : 你的 newStringBuffer(s) 方法 呢 ,

...时的小段程序,不知道什么意思,大侠帮忙解决一下
第一样告诉编译器,编译的时候针对此段代码不进行warning检查 然后这个方法返回的是一个List,list里面包含的是一个Object数组 里面针对此条sql语句进行查询,并返回查询结果,貌似你们dao是封装好的...

哪位大侠能用java程序实现下面的题目
运行结果:海盗总数:12.0 第一次喝倒人数:6 第二次喝倒人数:2 第三次喝倒人数:2 海盗总数:15.0 第一次喝倒人数:5 第二次喝倒人数:7 第三次喝倒人数:1 海盗总数:18.0 第一次喝倒人数:9 第二次喝倒人数:6 第三次喝倒人数:1 海盗总数:20.0 第一次喝倒人数:15 ...

求一非常简单的java 程序?
第一题:import java.util.Scanner;public class CountDate { public static void main(String[] args) { Scanner s = new Scanner(System.in);System.out.println("解放军战士连续作战的小时数:");int hours = s.nextInt();System.out.print("解放军战士连续作战");if(hours <= 0)System....

java我想知道怎样判断是否全是数字,,下面有我的代码,请大侠们看看,
也可以写正则表达式匹配。这里给你写一个最简单的 String ab=jEditorPane1.getText();String result = null;try { double d = Double.parseDouble(ab);result = "是数字";} catch (NumberFormatException e){ result = "不是数字";} 用类型转换判断是不是数字。如果不是的话转换会抛异常 ...

java程序在Eclipse中运行没有问题,打包成.jar文件之后运行后路径出现...
1.普通windows文件系统:file:\\D:\\MapModule\\img\\map\\map.jpg \/\/你一定要在这个路径上有文件才能读写 2.jar文件中的文件:jar:file:\\D:\\MapModule.jar!\\img\\map\\map.jpg 区别一眼就看出来了(2中有jar前缀,并且有'!')。给你一个获取输入流的方法:URL url=new URL("jar:file:\\D:\\...

Java为什么不能打印中文(java不能输出是什么原因)
为什么Java程序输出不了中文?这个应该是JDK默认编码的问题。你最好用一些源虚软件,比如Eclipse,这样,可以在软件里面调整默认编码为:UTF-8,那么她就会输出汉字。还有,记住,Java规掘竖定,雹散燃类名第一个字母必须大写。用些心啊,同学!!java调用打印机有时无法打印中文一般来说条码打印机都有...

哪位大侠,能帮我写一个JAVA的程序啊,小弟求各位出手相助啊
方法二:由于楼主信息太少,默认两文件是从小到大无重复排序,自己想着写的,不对的地方你再改吧,给你个大体思路。\/\/ 由于楼主给的信息太少,本示例程序默认两文件存double类型并从小到大排序并没有重复元素,得到的合并结果去重复 Scanner scan1 = new Scanner(new FileInputStream("file1.txt"))...

相似回答