在没同步前,怎么会输出取款余额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 星