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();
    
    
 }
}

解决方案 »

  1.   

    把同步放在Account 类中试试。
      

  2.   

    把同步方法放在get()和put()中
      

  3.   

    当多线程执行 同时进入你的 put get方法里面 就有可能出现数据异常
      

  4.   

    public void put(double value) 
    public double get(double value) 
    把这两个方法加上同步关键字synchronized
    public synchronized void put(double value) 
    public synchronized double get(double value) 
      

  5.   


    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;
    }