在没同步前,怎么会输出取款余额800后紧接着Bank的toString余额是1100?
//有一种运行结果如下: //存款后的账户余额为:1100 //取款后的账户余额:800 //Bank [账号:1001,余额:1100] package bank; 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 void saveAccount() { // 可以在不同的位置处添加sleep方法 // 获取当前的账号余额 int balance = getBalance(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } // 修改余额,存100元 balance += 100; // 修改账户余额 setBalance(balance); // 输出存款后的账户余额 System.out.println("存款后的账户余额为:" + balance); } // 取款 public void drawAccout() { // 获得当前的账户余额 int balance = getBalance(); // 修改余额,取200 balance = balance - 200; try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } // 修改账户余额 setBalance(balance); System.out.println("取款后的账户余额:" + balance); } } package bank; //存款 public class SaveAccount implements Runnable { Bank bank; public SaveAccount(Bank bank) { this.bank = bank; } @Override public void run() { bank.saveAccount(); } } package bank; //取款 public class DrawAccount implements Runnable { Bank bank; public DrawAccount(Bank bank) { this.bank = bank; } @Override public void run() { bank.drawAccout(); } } package bank; public class Test { public static void main(String[] args) { // 创建账户,给定余额1000 Bank bank = new Bank("1001", 1000); // 创建线程对象 SaveAccount sa = new SaveAccount(bank); DrawAccount da = new DrawAccount(bank); // 创建线程对象,实现Runnable的类对象作为参数传入 Thread save = new Thread(sa); Thread draw = new Thread(da); save.start(); draw.start(); // 加join方法的目的是想让打印输出bank的tostiring方法最后一个输出; try { save.join(); draw.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(bank); } }
2
收起
正在回答
6回答
同学你好,这里你可以这样理解,这里存款与取款都是一个线程,操作的对象没有加锁,而这两个线程是同时执行的,所以最后main方法中调用的toString方法输出的对象是随机的,可能是存款的线程中的也有可能是取款的线程中的哟,因为那是两个同时执行的线程!
所以最后输出的toString中的对象可能是取款线程中的结果,也有可能是存款线程中的结果!
如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~
Java零基础入门18
- 参与学习 人
- 提交作业 7317 份
- 解答问题 14452 个
想要入门学编程?多年一直活跃在编程语言排行版前列的Java是一个很好的选择。本路径将从Java基础语法、面向对象、常用工具类三部分,为你开启软件开发的大门!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星