package Tread;
public class Account {
private String accoutNo;//账号
private double money;//余额
// 无参构造
public Account() {
}
// 有参构造
public Account(String accoutNo, double money) {
this.accoutNo = accoutNo;
this.money = money;
}
public String getAccoutNo() {
return accoutNo;
}
public void setAccoutNo(String accoutNo) {
this.accoutNo = accoutNo;
}
public double getMmoney() {
return money;
}
public void setMmoney(double money) {
this.money = money;
}
// 取款方法
public void withDraw(double money){
// 使用线程同步机制处理线程的数据冲突
synchronized(this){//这里只有Account对象是共享的
// ()内容必须是多线程共享的,才能达到多线程同步机制(排队)
//开始账户的款额
double before = this.money;
//取钱
double after = before - money;
try {
// 模拟网络延迟
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//更新余额
this.setMmoney(after);
}
}
}
package Tread;
public class AccountThread extends Thread {
private Account act;
public AccountThread(Account act) {
this.act = act;
}
@Override
public void run() {
// 假设取款值为5000
double money = 5000;
act.withDraw(money);
System.out.println(Thread.currentThread().getName()+"对"+act.getAccoutNo()+"取款成功,余额为:"+act.getMmoney());
}
}
package Tread;
public class TestAccount {
public static void main(String[] args) {
Account a = new Account("act-001", 10000);
Thread t1 = new AccountThread(a);
Thread t2 = new AccountThread(a);
t1.setName("t1");
t2.setName("t2");
t1.start();
t2.start();
}
}
正确结果: