在没同步前,怎么会输出取款余额800后紧接着Bank的toString余额是1100?
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 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 | //有一种运行结果如下: //存款后的账户余额为: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积分~
来为老师/同学的回答评分吧