线程安全问题(原来这就是赚钱的最佳方法)

本文通过一个简单的银行账户取款案例,展示了在Java中如果不考虑线程安全,可能会导致数据不一致的问题。小明和小红同时从共享账户中取款,由于没有同步控制,银行可能损失10万元。文章提示,实际的银行系统会使用锁或其他同步机制来避免此类问题,并预告下期将介绍解决线程安全问题的方法。
摘要由CSDN通过智能技术生成

案例:

小明和小红是一对夫妻,他们有一个共同的账户,账户里有10万元

他们同时来取钱,并且他们都取了10万元,这个时候会发生什么呢?

//多个线程同时访问同一个共享资源而且修改了该资源,便会产生线程安全问题
public class 多线程_3线程安全案例 {
    public static void main(String[] args) {
        //定义线程类,创建一个共享的账户对象
        account a=new account("abc",10000);
        //创建两个取钱的线程对象
        new drawthread(a,"小明").start();
        new drawthread(a,"小红").start();
    }
}
//取钱的线程类
class drawthread extends Thread{
    //接收处理的账户对象
    private account acc;
    public drawthread(account acc,String name){
        super(name);
        this.acc=acc;
    }
    public void run(){
        //取钱
        acc.drawmoney(10000);

    }
}
class account{
    private String cartId;
    private double money;//账户余额

    public account() {
    }

    public account(String cartId, double money) {
        this.cartId = cartId;
        this.money = money;
    }

    public String getCartId() {
        return cartId;
    }

    public void setCartId(String cartId) {
        this.cartId = cartId;
    }

    public double getMoney() {
        return money;
    }

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

    public void drawmoney(double money) {
        //先获取是谁来取钱,线程名即是人名
        String name=Thread.currentThread().getName();
        //判断账户是否够钱
        if(this.money>=money){
            //取钱
            System.out.println(name+"来取钱成功,取了:"+money);
            //更新金额
            this.money-=money;
            System.out.println(name+"取钱后剩余:"+this.money);
        }else{
            //余额不足
            System.out.println(name+"来取钱,但余额不足!");
        }
    }
}

 答案是:银行亏了10万元,而小明和小红白嫖了10万元

看到这很多人不免有个大胆的想法

别急,这种低级错误银行当然不会犯,下期将为大家揭晓解决方案

  • 33
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 50
    评论
评论 50
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

遇安.YuAn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值