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

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;}
}
...全文
198 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
明明 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

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧