线程的随机执行

线程的随机执行

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 "银行{" +
                "账户:" + account  +
                ", 余额:" + balance +
                '}';
    }
 
    public void save(int money){
        int balance = getBalance();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        balance += money;
        setBalance(balance);
        System.out.println("存款后的金额"+getBalance());
 
    }
 
    public void take(int money){
            int balance = getBalance();
            balance -= money;
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            setBalance(balance);
            System.out.println("取款后的金额"+getBalance());
 
 
    }
 
 
}

1,

取款后的帐户余额:800

存款后的账户余额为:800


老师,这种情况的出现的原因

首先是存款线程先获取CPU使用权,然后阻塞,取款线程获取CPU使用权并修改余额为800,然后取款线程也阻塞,存款线程获取CPU使用权,修改金额并统过set方法设置成员属性为1100,然后取款线程获取CPU使用权,通过set方法修改成员属性为800,最后分别执行存取款中的输出语句就都是800了


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕阿园 2022-04-09 14:02:27

同学你好,是的,线程运行过程中是会出现随机情况的,所以我们才需要使用synchronized关键字

祝学习愉快~


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

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

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

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

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

帮助反馈 APP下载

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

公众号

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

在线咨询

领取优惠

免费试听

领取大纲

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