1.什么是线程安全问题:
多个线程同时操作同一个共享资源的时候可能会出现业务安全问题,称为线程安全问题。
2.取钱模型演示:
1.需求:小明和小红是一对夫妻,他们有一个共同的账户,余额是10万元。
2.如果小明和小红同时来取钱,而且2人都要取钱10万元,可能出现什么问题呢?
3.图解
4.代码演示:
主类
public class ThreadSafe {
public static void main(String[] args) {
Account account = new Account("lining", 1000);
// 创建两个线程对象
new DrawThread(account, "小白").start();
new DrawThread(account, "小黑").start();
}
}
public class DrawThread extends Thread{
// 接收处理的账户对象
private Account acc;
// private String name;
public DrawThread(Account acc,String name){
super(name);
this.acc = acc;
}
@Override
public void run() {
acc.drawMoney(1000);
}
}
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();
if(this.money >= money){
System.out.println(name+"成功取钱,吐出"+money);
// 更新余额
this.money -= money;
System.out.println(name+"取钱后剩余:"+this.money);
}else{
// 余额不足
System.out.println(name+"来取钱,余额不足!");
}
}
}
5.运行结果:
6.总结线程安全问题出现的原因:
①存在多线程并发
②同时访问共享资源
③存在修改共享资源