出现问题的原因:
- 存在多个线程在同时执行
- 同时访问一个共享资源
- 存在修改该共享资源
我们来看一下取钱问题,小红和小明有一个共同的账户有1000元,一起取钱
Accout代码
package hust.cs.money;
public class Account {
private double money; // 余额
private String cardId; // 卡号
public Account() {
}
public Account(double money, String cardId) {
this.money = money;
this.cardId = cardId;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public String getCardId() {
return cardId;
}
public void setCardId(String cardId) {
this.cardId = cardId;
}
public void drawMoney(double i){
// 我们还要搞清楚谁来取钱
String m = Thread.currentThread().getName();
if(this.money>=i){
System.out.println(m+"来取"+i+"成功");
this.money -=i;
System.out.println("还剩下"+this.money);
}else{
System.out.println(m + "来取钱,钱不够");
}
}
}
ThreadTask代码
package hust.cs.money;
public class ThreadTask {
// 创建一个账户对象,代表两个人的共享账户
public static void main(String a[]){
Account acc = new Account(1000,"ICBC-001");
// 两个人同时取钱
// 创建两个线程代表两个人取钱
new DrawThread(acc,"小明").start(); // 第一个人取钱
new DrawThread(acc,"小红").start(); // 第二个人取钱
}
}
DrawThread代码
package hust.cs.money;
public class DrawThread extends Thread{
Account acc;
DrawThread(Account acc,String name){
super(name);
this.acc = acc;
}
@Override
public void run() {
// 取钱
acc.drawMoney(1000);
}
}