多线程之安全取钱

这篇博客通过一个Java程序展示了并发环境下两个线程同时从同一个账户取款可能导致的安全问题。程序中创建了两个线程,分别尝试取款,由于没有正确同步账户操作,导致可能的线程安全问题。博客强调了在多线程编程中对共享资源进行同步控制的重要性。
摘要由CSDN通过智能技术生成
package com.lyon.demo;

//不安全的取钱
//两个人去银行取钱,账户
public class UnsafeBuyBank {

    public static void main(String[] args) {
        //账户
        Account account = new Account(100,"生活日用");
        Drawing my = new Drawing(account,50,"lyon");
        Drawing son = new Drawing(account,100,"son");
        my.start();
        son.start();
    }
}

//账户
class Account{
    int money; //余额
    String name;//卡名

    public Account(int money, String name) {

        this.money = money;
        this.name = name;
    }
}

//银行:模拟取钱
class Drawing extends  Thread{
    //账户
    Account account;
    //取了多少钱
    int drawingMoney;
    //现在手里有多少钱
    int nowMoney;

    public Drawing(Account account,int drawingMoney, String name){
        super(name);
        this.account = account;
        this.drawingMoney = drawingMoney;
    }

    //取钱
    //synchronized 默认锁的是this
    @Override
    public  void run() {
        //增删改查操作的是account对象,需要锁account,而不是锁 run()方法
        //synchronized (this){  锁this还是锁银行或者说是锁 run()方法
        synchronized (account){
            if(account.money - drawingMoney < 0){
                System.out.println(Thread.currentThread().getName()+"钱不够了");
                return;
            }

            try{
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            //账户余额
            account.money -= drawingMoney;
            //手中现金
            nowMoney += drawingMoney;
            System.out.println(account.name+"余额是:"+account.money);
            //Thread.currentThread().getName()
            System.out.println(this.getName()+"手里有"+nowMoney);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值