线程安全问题:
多个线程操作同一个线程的时候,可能会出现业务安全问题。
1.线程安全问题出现的原因
存在多线程并发
同时访问共享资源
存在修改共享资源
package com.Demo;
public class Account {
private String carId;
private double money;
public Account() {
}
public Account(String carId, double money) {
this.carId = carId;
this.money = money;
}
public String getCarId() {
return carId;
}
public void setCarId(String carId) {
this.carId = carId;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public void drawMoney(double money) {
//1判断账户
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+"来取钱余额不足剩余"+this.money);
}
}
}
package com.Demo;
public class DrawThread extends Thread{
//接收处理账户对象
private Account acc;
//直接给线程起名字
public DrawThread(Account acc,String name){
//切记,如果通过构造方法给线程起名字,一定要调用父类的构造方法
super(name);
this.acc=acc;
}
public DrawThread(int i){
System.out.println("hahahahaaaaaaaaaaaaaaaaaaaaaaaaaa");
}
@Override
public void run() {
//取钱的方法,小明小红都在取钱
acc.drawMoney(100000);
}
}
package com.Demo;
public class ThreadDemo {
public static void main(String[] args) {
/*
1.定义线程类,创建一个共享的账户对象
*/
Account acc = new Account("ICBC-111",100000);
//2.创建两个线程对象,代表小明和小红同时进来的。
new DrawThread(acc,"小明").start();
new DrawThread(acc,"小红").start();
}
}
输出:
小红来取钱成功吐出100000.0
小红取钱后剩余0.0
小明来取钱成功吐出100000.0
小明取钱后剩余-100000.0