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 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)
 {
 
}
 
 this.account.put(this.value);
 System.out.println(this.account.getName()+"账户;现有"+howmatch+",存入"+this.value+",余额"+this.account.balance());
 
    }

 
 }
 }
 
public class FetchLocal extends Thread {
       private Account account;
       private double value;
       public FetchLocal(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 FetchLocal(wang,300)).start();
       }
}
这个程序的输出结果为什么是这样??
Wang账户;现有0.0,存入100.0,余额100.0
Wang账户:现有100.0,取走100.0,余额0.0
Wang账户;现有0.0,存入200.0,余额200.0
而不是
Wang账户;现有0.0,存入100.0,余额100.0
Wang账户:现有100.0,存入200.0,余额300.0
Wang账户;现有300.0,取走300.0,余额0.0求解释!!

解决方案 »

  1.   

    你新建一个类试试。我测试过代码没有问题,答案是Wang账户;现有0.0,存入100.0,余额100.0
    Wang账户;现有100.0,存入200.0,余额300.0
    Wang账户:现有300.0,取走300.0,余额0.0
      

  2.   

    有点复杂啊,你可以逐部分测试一下,追踪一下SaveLock方法中value的取值变化,
    在程序每个部分输出一下,以了解其执行顺序
      

  3.   

    synchronized这里是同步的意思,就是说当前如果有线程在操作那么就要等待前一个线程释放锁。那么线程都是同步的,所以不会按顺序运行。你可以设置线程的优先级。
      

  4.   

    Java线程是抢占式的 每个线程都有执行的机会 除非用Synchronized来声明 否则不会按顺序的 有点随机的味道
      

  5.   

    继承Thread不会实现资源共享,建议实现runnable接口。