java模拟两个线程异步取款问题(发生数据共享冲突)

package Tread;

public class Account {
    private  String accoutNo;//账号

    private  double money;//余额

//    无参构造
    public Account() {
    }

//    有参构造
    public Account(String accoutNo, double money) {
        this.accoutNo = accoutNo;
        this.money = money;
    }

    public String getAccoutNo() {
        return accoutNo;
    }

    public void setAccoutNo(String accoutNo) {
        this.accoutNo = accoutNo;
    }

    public double getMmoney() {
        return money;
    }

    public void setMmoney(double money) {
        this.money = money;
    }

//  取款方法
    public void withDraw(double money){
        //开始账户的款额
        double before = this.money;

        //取钱
        double after = before - money;

        try {
//            模拟网络延迟
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //更新余额
        this.setMmoney(after);
    }
}


package Tread;

public class AccountThread extends Thread {

    private  Account act;

    public AccountThread(Account act) {
        this.act = act;
    }
    @Override
    public void run() {
//        假设取款值为5000
        double money = 5000;
        act.withDraw(money);
        System.out.println(Thread.currentThread().getName()+"对"+act.getAccoutNo()+"取款成功,余额为:"+act.getMmoney());


    }
}

package Tread;

public class TestAccount {
    public static void main(String[] args) {


        Account a = new Account("act-001", 10000);
        Thread t1 = new AccountThread(a);
        Thread t2 = new AccountThread(a);
        t1.setName("t1");
        t2.setName("t2");
        t1.start();
        t2.start();

    }


}

2个对象取款后,后面一个余额应该为0,但是线程异步执行后,错误输出结果(线程不安全):
在这里插入图片描述
如何解决问题呢?
解决该文模拟银行取款线程共享数据的问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会尽力回答你的问题。以下是 Java线程模拟银行取款的代码实现。 ```java public class BankAccount { private int balance; // 银行账户余额 public BankAccount(int initialBalance) { balance = initialBalance; } // 取款方法 public synchronized void withdraw(int amount) { if (balance >= amount) { System.out.println("取款成功,取出 " + amount + " 元"); balance -= amount; } else { System.out.println("余额不足,取款失败"); } } // 查询余额方法 public synchronized void checkBalance() { System.out.println("当前余额为 " + balance + " 元"); } } public class BankClient implements Runnable { private BankAccount account; public BankClient(BankAccount account) { this.account = account; } @Override public void run() { while (true) { // 模拟不定期取款 int amount = (int) (Math.random() * 1000); account.withdraw(amount); try { // 线程休眠,模拟银行服务 Thread.sleep((int) (Math.random() * 1000)); } catch (InterruptedException e) { e.printStackTrace(); } account.checkBalance(); } } } public class Main { public static void main(String[] args) { BankAccount account = new BankAccount(10000); BankClient client1 = new BankClient(account); BankClient client2 = new BankClient(account); Thread thread1 = new Thread(client1); Thread thread2 = new Thread(client2); thread1.start(); thread2.start(); } } ``` 以上代码实现了一个简单的 Java线程模拟银行取款的程序。程序中,BankAccount 类表示银行账户,包含取款和查询余额的方法。BankClient 类表示银行客户,模拟不定期地取款和查询余额的操作。Main 类是程序的入口,创建了两个 BankClient 实例,并启动了两个线程分别执行客户操作。 注意,在 BankAccount 类的取款方法和查询余额方法上都使用了 synchronized 关键字,确保了线程安全。此外,线程休眠的时间也是随机的,以模拟不同客户不定期的取款和查询操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值