什么是线程安全问题?
- 多个线程,同时操作同一个共享资源的时候,可能会出现业务安全问题。
线程安全问题出现的原因?
- 存在多个线程在同时执行
- 同时访问一个共享资源
- 存在修改该共享资源
代码演示如下:
账户类:
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(); } }