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

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

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

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

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

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

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

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

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