大侠们帮我看看下面的程序取钱系统为什么不能同步额 解释详细点啊 小弟刚接触java 谢谢了

[复制链接]
查看11 | 回复2 | 2011-3-26 17:54:17 | 显示全部楼层 |阅读模式
class Account{
private double amount = 1000;
public synchronized void withdraw(float amt){
amount = amount - amt ;
}
public double checkBalance(){
return amount;
}

}
public class RunSync implements Runnable{
private Account account = new Account();
public void run(){
for(int i = 0;i<5;i++){
account.withdraw(100);
try {

Thread.sleep(1000);
} catch (InterruptedException e) {

e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"取走了100后账号余额"+account.checkBalance());
}
}

public static void main(String[] args) {
RunSync r = new RunSync();
Thread t1 = new Thread(r,"husband");
Thread t2 = new Thread(r,"wife");
t1.start();
t2.start();

}
}
我运行后结果是
husband取走了100后账号余额800.0
wife取走了100后账号余额800.0
wife取走了100后账号余额600.0
husband取走了100后账号余额600.0
husband取走了100后账号余额400.0
wife取走了100后账号余额400.0
husband取走了100后账号余额200.0
wife取走了100后账号余额200.0
husband取走了100后账号余额0.0
wife取走了100后账号余额0.0
可是如果同步了 那结果应该是这样的啊 :
husband取走了100后账号余额900.0
husband取走了100后账号余额800.0
husband取走了100后账号余额700.0
husband取走了100后账号余额600.0
husband取走了100后账号余额500.0
wife取走了100后账号余额400.0
wife取走了100后账号余额300.0
wife取走了100后账号余额200.0
wife取走了100后账号余额100.0
wife取走了100后账号余额0.0
希望能解释清楚点儿为什么我的不能同步额刚接触java .. 、

回复

使用道具 举报

千问 | 2011-3-26 17:54:17 | 显示全部楼层
你这个需要多线程来做啊...而且需要同步~每个人取钱时候其他线程需要进入等待状态,当执行完毕之后再唤醒其他线程来执行~~~多个线程用synchronized 来帮顶同步进入之后其他线程用wait()进入等待状态...执行完成后用notifyAll()来唤醒其他线程~~~你看看我的这个生产和消费的例子~~应该能理解同步的~~~希望对你有帮助import java.util.*;class Factor{ private String[] cards = new String [10]; int index = 0; //生产方法 public synchronized void pop(String name){
回复

使用道具 举报

千问 | 2011-3-26 17:54:17 | 显示全部楼层
问题出在Thread.sleep上。因为hushand取走100后,在这一秒内,wife“偷偷”取走了100,而husband并不知晓,仍然以为余额是900,所以与实际余额不符。修改方案:其余不懂,将“System.out.println(Thread.currentThread().getName()+"取走了100后账号余额"+account.che
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行