public class Account //帐户类
{
private String name; //储户姓名
private double balance; //帐户余额
public Account(String name)
{
this.name=name;
this.balance=0;
}
public String getName() //返回帐户名
{
return name;
}
public double balance() //查看帐户余额
{
return balance;
}
public void put(double value) //存款操作,参数为存入金额
{
if(value>0)
this.balance+=value; //存款操作使余额增加
}
public double get(double value) //取款操作,参数为取款金额,返回实际取到金额
{
if(value>0)
{
if(value<=this.balance)
this.balance-=value; //取款操作使余额减少
else //帐号余额不够所取时
{
value=this.balance; //取走全部余额
this.balance=0;
}
return value; //返回实际取款额
}
return 0;
}
}
/*********************************************************************************/
class SaveLock extends Thread //带互斥锁的存款线程程序类
{
private Account account; //帐户
private double value; //存款金额
public SaveLock(Account al,double value)
{
this.account=al;
this.value=value;
}
public void run() //声明临界区,锁定指定账户对象
{
synchronized(this.account)
{
double howmatch=this.account.balance();//查看帐户余额
try
{
sleep(1); //花费时间,线程被打断
}
catch(InterruptedException e){}
this.account.put(this.value);
System.out.println(this.account.getName()+"帐户: 现有"+howmatch+
",存入"+this.value+",余额"+this.account.balance());
}
}
}
/**********************************************************************************/
class FetchLock extends Thread //带互斥锁的取款线程程序类
{
private Account account;
private double value;
public FetchLock(Account a1,double value)
{
this.account=a1;
this.value=value;
}
public void run()
{
synchronized(this.account) //声明临界区,锁定指定账户对象
{
double howmatch=this.account.balance(); //查看帐户余额
try
{
sleep(1); //花费时间,线程被打断
}
catch(InterruptedException e){}
System.out.println(this.account.getName()+"帐户: 现有"+howmatch+
",取走"+this.account.get(this.value)+",余额"+this.account.balance());
}
}
public static void main(String args[])
{
Account wang=new Account("Wang");
(new SaveLock(wang,100)).start();
(new SaveLock(wang,200)).start();
(new FetchLock(wang,300)).start();
}
}
{
private String name; //储户姓名
private double balance; //帐户余额
public Account(String name)
{
this.name=name;
this.balance=0;
}
public String getName() //返回帐户名
{
return name;
}
public double balance() //查看帐户余额
{
return balance;
}
public void put(double value) //存款操作,参数为存入金额
{
if(value>0)
this.balance+=value; //存款操作使余额增加
}
public double get(double value) //取款操作,参数为取款金额,返回实际取到金额
{
if(value>0)
{
if(value<=this.balance)
this.balance-=value; //取款操作使余额减少
else //帐号余额不够所取时
{
value=this.balance; //取走全部余额
this.balance=0;
}
return value; //返回实际取款额
}
return 0;
}
}
/*********************************************************************************/
class SaveLock extends Thread //带互斥锁的存款线程程序类
{
private Account account; //帐户
private double value; //存款金额
public SaveLock(Account al,double value)
{
this.account=al;
this.value=value;
}
public void run() //声明临界区,锁定指定账户对象
{
synchronized(this.account)
{
double howmatch=this.account.balance();//查看帐户余额
try
{
sleep(1); //花费时间,线程被打断
}
catch(InterruptedException e){}
this.account.put(this.value);
System.out.println(this.account.getName()+"帐户: 现有"+howmatch+
",存入"+this.value+",余额"+this.account.balance());
}
}
}
/**********************************************************************************/
class FetchLock extends Thread //带互斥锁的取款线程程序类
{
private Account account;
private double value;
public FetchLock(Account a1,double value)
{
this.account=a1;
this.value=value;
}
public void run()
{
synchronized(this.account) //声明临界区,锁定指定账户对象
{
double howmatch=this.account.balance(); //查看帐户余额
try
{
sleep(1); //花费时间,线程被打断
}
catch(InterruptedException e){}
System.out.println(this.account.getName()+"帐户: 现有"+howmatch+
",取走"+this.account.get(this.value)+",余额"+this.account.balance());
}
}
public static void main(String args[])
{
Account wang=new Account("Wang");
(new SaveLock(wang,100)).start();
(new SaveLock(wang,200)).start();
(new FetchLock(wang,300)).start();
}
}
public double get(double value)
把这两个方法加上同步关键字synchronized
public synchronized void put(double value)
public synchronized double get(double value)
public double get(double value) {
//同步确实是同步了,但是这个方法的处理逻辑有问题,余额够就减掉,不够的话,有多少就减多少
//如果现在余额是100,要取300的话,只会减掉100,而不是减掉300. this.balance -= value;
/*
if (value > 0) {
if (value <= this.balance)
this.balance -= value;
else {//
value = this.balance;
this.balance = 0;
}
return value;
}
*/
return 0;
}