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