一个应该出错,但却没有出错的程序,大家来看一下..........

linkboy2004 2005-03-12 09:26:43
一个老师用来说明Synchronized作用的程序:十个人向一个帐户存700万次钱,最后帐户应该为多少?
因为没有Synchronized,所以我觉得应该是大于7000万的,但是我在我的电脑上运行却是正好...
奇怪......如果要加Synchronized,加在哪里呢?


public class SynchronizedDemo{
public static void main(String arg[]){
MyThread employee[]=new MyThread[10];
BankAccount CorpAccount=new BankAccount(0L);
for(int i=0;i<10;i++){
employee[i]=new MyThread(CorpAccount);
}
for(int i=0;i<10;i++){employee[i].start();}
waitloop:
while(true){
for(int i=0;i<10;i++)
if(employee[i].isAlive()) continue waitloop;
break;
}
System.out.println(CorpAccount.publicAccount);
}
}
class MyThread extends Thread{
BankAccount LocalAccount;
public MyThread(BankAccount b){LocalAccount=b;}
public void run(){
for(int i=0;i<7000000;i++){
LocalAccount.publicAccount+=10;
}
}
}
class BankAccount{
long publicAccount=0;
public BankAccount(long value){publicAccount=value;}
}
...全文
114 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
明明 2005-03-13
LocalAccount.publicAccount+=10

你这里只有增加操作。如果你还有读取,判断操作,就会有不同结果了。

举例:
System.out.println(LocalAccount.publicAccount);
LocalAccount.publicAccount+=10;
System.out.println(LocalAccount.publicAccount);
这里需要同步。不然结果,肯定不一样。(也就是所有可能打出的结果只差不是10,搂主试试)

在多线程中楼主最好打个变量标示不同的线程:

System.out.println(LocalAccount.hashCode+":"+LocalAccount.publicAccount);
回复
飞行的兔子 2005-03-13
这与计算机速度慢毫无任何关系,楼主还是要看看线程和同步的内容,仔细理解!
回复
平淡面对 2005-03-13
本来就应该正确,这里同步和不同步结果一样。
LocalAccount.publicAccount+=10
这句本来就是同步的。
回复
linkboy2004 2005-03-13
为什么不同步也会正确,是计算机速度慢的缘故吧?
回复
飞行的兔子 2005-03-13
为了验证同步,你需要将synthornized函数加在会同时进行存款的语句上,在你的代码中是run方法,
你可以将run方法声明为synthornized的,或者堆其中的存款语句同步
1:public void synthornized run()
2:synthornized(Object o){
for(int i=0;i<7000000;i++){
LocalAccount.publicAccount+=10;
}
回复
bearimh 2005-03-13
帮你up一下
回复
linkboy2004 2005-03-13
up
回复
相关推荐
发帖
Java EE
创建于2007-09-28

6.6w+

社区成员

J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
申请成为版主
帖子事件
创建了帖子
2005-03-12 09:26
社区公告
暂无公告