synchronized Bank帐户事务java方法

时间:2014-07-10 09:46:00

标签: java synchronized

我编写了以下Account类和同步事务方法:

public class Account{
  private boolean accessFree = true;
  private int balance = 0;

  public Account(int balance){
    this.balance = balance;
  }

  public synchronized void transaction(int amount){
    while(!accesFree || amount>balance){
      try{wait();}
      catch (InterruptedException e){}}
    }
    accessFree = false;
    balance = balance + amount;
    accessFree = true;
    notifyAll();
  }

我的目标是让这种交易方法一次只能供一位银行家使用,而且银行家也不能拿到比帐户更多的钱,如果他试图拿100美元并且他只有50美元必须等到其他银行家存款。

编写此方法后出现了一个问题。 如果此方法同步,为什么我需要拥有accesFree变量?因为无论如何只有一个人可以一次进入这个方法..不可能有两个(共享相同的Account对象)一次使用相同的方法

2 个答案:

答案 0 :(得分:0)

您不需要accessFree变量,使其同步就足够了。

并且accessFree实现不正确。如果线程处于等待状态,则没有代码可以调用notify,因此线程将永远休眠。

答案 1 :(得分:0)

public synchronized void transaction(int amount){
    while(amount>balance){
    balance = balance + amount;
  }

这足够了

这甚至更好

while(amount>balance){
synchronized(this){
       this.balance+= amount;   
    }
}

有时不必同步整个方法,最好只同步方法的一部分。虽然在你的情况下并不重要,但是在复杂的方法中,你应该只对方法的一部分进行锁定,该方法对并发修改敏感并允许其他线程完成他们的工作