[进阶]Java:线程安全问题、取钱模拟

什么是线程安全问题?

  • 多个线程,同时操作同一个共享资源的时候,可能会出现业务安全问题。

线程安全问题出现的原因?

  • 存在多个线程在同时执行
  • 同时访问一个共享资源
  • 存在修改该共享资源

[进阶]Java:线程安全问题、取钱模拟_第1张图片

代码演示如下:

账户类:

public class Account {
    private String cardId;
    private double money;

    public Account() {
    }

    public Account(String cardId, double money) {
        this.cardId = cardId;
        this.money = money;
    }

    //小明 小红同时过来的
    public void drawMoney(double money){
        // 先搞清楚是谁来取钱
        String name = Thread.currentThread().getName();
        //1.判断余额是否足够
        if (this.money >= money){
            System.out.println(name + "来取钱" + money + "成功~");
            this.money -= money; // 更新余额
            System.out.println(name + "来取钱后,余额剩余:" + this.money);
        }else {
            System.out.println(name + "来取钱,余额不足~");
        }
    }

    public String getCardId() {
        return cardId;
    }

    public void setCardId(String cardId) {
        this.cardId = cardId;
    }

    public double getMoney() {
        return money;
    }

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

线程类:

public class DrawThread extends Thread{
    private Account acc;
    public DrawThread(Account acc,String name){
        super(name);
        this.acc = acc;
    }
    @Override
    public void run(){
        //取钱(小明 小红)
        acc.drawMoney(100000);
    }
}

测试类:

public class ThreadTest {
    public static void main(String[] args) {
        //1.创建一个账户对象,代表两个人的共享账户
        Account acc = new Account("ICBC-666",100000);
        //2.创建两个线程,分别代表小明 小红,再去同一个账户
        new DrawThread(acc,"小明").start();
        new DrawThread(acc,"小红").start();
    }
}

 

你可能感兴趣的:([进阶]Java:多线程一,java,开发语言)