我编写了以下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对象)一次使用相同的方法
答案 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;
}
}
有时不必同步整个方法,最好只同步方法的一部分。虽然在你的情况下并不重要,但是在复杂的方法中,你应该只对方法的一部分进行锁定,该方法对并发修改敏感并允许其他线程完成他们的工作