4-1线程同步,存100,取200,会出现取款后余额为800,这是什么原因

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回答
好帮手慕小尤 2020-03-01 17:55:10

同学你好,测试代码未发现此现象,建议同学查看是否有设置线程同步。如果没有,则参考代码如下:

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);
		}

	}
}

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师