线程安全问题:
多个线程同时操作阿一个共享资源的时候可能公出现线程安全问题。
模拟出取款问题的案例:
用高度面向对象的思想设计。
分析:
(1)提供:一个账户类Account.java作为创建共享资源账户对象的类。
(2)定义个线程采用于创建2个线程分别代表两个人同时取钱。
Account 账户类
public class Account {
private String cardID;
private double money;
public Account() {
}
public Account(String cardID, double money) {
this.cardID = cardID;
this.money = money;
}
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 void drawMoney(double money) {
//开始判断取钱逻辑
//1.先知道是谁来取钱
String name = Thread.currentThread().getName();
//2.判断余额是否足够
if (this.money >= money){
System.out.println(name + "来取钱,余额足够,取出:"+money);
//3.更新余额
this.money -=money;
System.out.println(name+"取走了钱,账户余额为:"+ this.money);
}else {
System.out.println(name + "来取钱,余额不足!");
}
}
}
线程类:
//线程类:创建取钱线程对象
public class DrawThread extends Thread{
//定义一个成员变量接受账户对象
private Account acc;
public DrawThread(Account acc, String name){
super(name);
this.acc = acc;
}
@Override
public void run() {
//取钱1000
acc.drawMoney(1000);
}
}
测试类
public class ThreadSafe {
public static void main(String[] args) {
//创建一个共享资源账户对象
Account acc = new Account("acc1",1000);
//创建两个线程对象去账户对象中取钱
Thread guy1 = new DrawThread(acc,"第一个人");
guy1.start();
Thread guy2 = new DrawThread(acc,"第二个人");
guy2.start();
}
}