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
同学你好,测试代码未发现此现象,建议同学查看是否有设置线程同步。如果没有,则参考代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | 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积分~
来为老师/同学的回答评分吧