线程安全问题出现的原因?
存在多线程并发
同时访问共享资源
存在修改共享资源
案例(让系统出现线程安全问题)
A和B有 一个共同账户,余额为10万元,模拟两个人同时取款
分析
需要提供一个账户类,创建一个账户对象代表两人共享账户
需要定义一个线程类,线程类可以处理账户对象
创建2个线程对象,传入同一个账户对象
启动两个线程,去同一个账户中取钱10万。
故意先让前先取出来,在进行金额更新
创建账户类
package 多线程案例;
public class Account {
private String cardid; //卡号
private double money;//账户余额
/**
* @return the cardid
*/
public String getCardid() {
return cardid;
}
/**
* @param cardid the cardid to set
*/
public void setCardid(String cardid) {
this.cardid = cardid;
}
/**
* @return the money
*/
public double getMoney() {
return money;
}
/**
* @param money the money to set
*/
public void setMoney(double money) {
this.money = money;
}
public Account(String cardid, double money) {
super();
this.cardid = cardid;
this.money = money;
}
public Account() {
super();
}
public void drawMoney(double money) {
System.out.println(Thread.currentThread().getName()+"正在取款");
if(this.money>=money) {
System.out.println(Thread.currentThread().getName()+"取款"+money);
this.money-=money;
System.out.println("卡内还剩"+this.money);
}else {
System.out.println("余额不足");
}
}
}
创建线程类
package 多线程案例;
//线程类
public class MyThread extends Thread{
private Account ac;//接用户对象
public MyThread(Account ac,String name) {
// TODO Auto-generated constructor stub
super(name);
this.ac = ac;
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
ac.drawMoney(100000);
}
}
主函数
package 多线程案例;
public class Test {
public static void main(String[] args) {
//创建一个共同账户
Account a1=new Account("aa-123",100000); //公用一张卡存入10万
//创建线程对象,并运行
new MyThread(a1,"A").start();
new MyThread(a1,"B").start();
}
}
控制台输出为
A正在取款
B正在取款
A取款100000.0
B取款100000.0
卡内还剩0.0
卡内还剩-100000.0