4-1线程同步,存100,取200,会出现取款后余额为800,这是什么原因
执行多次时,会出现
存款后的账户余额为:1100
取款后的账户余额为:800
Bank [账号=1001, 余额=800]
以及正确的
存款后的账户余额为:1100
取款后的账户余额为:900
Bank [账号=1001, 余额=900]
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Bank bank = new Bank("1001",1000);
// 创建线程对象
SaveAccount sa = new SaveAccount(bank);
DrawAccount da = new DrawAccount(bank);
Thread save = new Thread(sa);
Thread draw = new Thread(da);
save.start();
draw.start();
try {
draw.join();
save.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(bank);
}
}
正在回答 回答被采纳积分+1
同学你好,测试代码未发现此现象,建议同学查看是否有设置线程同步。如果没有,则参考代码如下:
public class Bank { private String account;// 账号 private int balance;// 账户余额 public Bank(String account, int balance) { this.account = account; this.balance = balance; } public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public int getBalance() { return balance; } public void setBalance(int balance) { this.balance = balance; } @Override public String toString() { return "Bank [账号:" + account + ", 余额:" + balance + "]"; } // 存款 public synchronized void saveAccount() { // 获取当前的账号余额 int balance = getBalance(); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 修改余额,存100元 balance += 100; // 修改账户余额 setBalance(balance); // 输出存款后的账户余额 System.out.println("存款后的账户余额为:" + balance); } public void drawAccount() { synchronized (this) { // 在不同的位置处添加sleep方法 // 获得当前的帐户余额 int balance = getBalance(); // 修改余额,取200 balance = balance - 200; try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 修改帐户余额 setBalance(balance); System.out.println("取款后的帐户余额:" + balance); } } }
如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
- 参与学习 人
- 提交作业 3802 份
- 解答问题 11489 个
本阶段带你迈入Java世界,学习Java必备基础知识,基础语法、面向对象思想以及常用工具类的使用。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星