Java多线程(全)学习笔记(中).doc
文本预览下载声明
资源下载地址:/detail/cloudyxuq/3763101
四.多线程的同步
以一个取钱列子来分析:(用户登录那些省略)
Accout类:
[java] view plaincopy
/**银行取钱,账户类*/
public class Accout {
//账户编号
private String accoutNo;
//账户余额
private double balance;
//账户名称
private String accoutName;
public Accout(){
super();
}
public Accout(String accoutNo,String accoutName, double balance) {
super();
this.accoutNo = accoutNo;
this.balance = balance;
this.accoutName=accoutName;
}
public String getAccoutNo() {
return accoutNo;
}
public void setAccoutNo(String accoutNo) {
this.accoutNo = accoutNo;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
public String getAccoutName() {
return accoutName;
}
public void setAccoutName(String accoutName) {
this.accoutName = accoutName;
}
//根据accoutNohe来计算Accout的hashcode和判断equals
@Override
public int hashCode() {
return accoutNo.hashCode();
}
@Override
public boolean equals(Object obj) {
if(obj!=nullobj.getClass()==Accout.class){
Accout target=(Accout)obj;
return target.getAccoutNo().equals(accoutNo);
}
return false;
}
}
DrawThread类:
[java] view plaincopy
/**取钱的线程类*/
public class DrawThread implements Runnable{
//模拟用户账户
private Accout accout;
//当前取钱线程所希望取得值
private double drawAmount;
public DrawThread(Accout accout, double drawAmount) {
super();
this.accout = accout;
this.drawAmount = drawAmount;
}
//如果多个线程修改同一个共享数据时,会发生数据安全问题
public void run() {
//账户余额大于取款金额时
if(accout.getBalance()=drawAmount){
//取款成功
System.out.println(Thread.currentThread().getName()+accout.getAccoutName()+取款成功:吐出钞票:+drawAmount);
//修改余额
accout.setBalance(accout.getBalance()-drawAmount);
System.out.println(当前余额为:+accout.getBalance());
}
//账户金额不够时
else{
System.out.println(账户金额不够,您的余额只有+accout.getBalance());
}
}
}
TestDraw测试类:
[java] view plaincopy
public class TestDraw {
public static void main(String[]args) throws
显示全部