【发布时间】:2014-07-10 09:46:00
【问题描述】:
我写了如下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 对象)一次在同一个方法中
【问题讨论】:
-
你不需要这个变量。事实上,这是没有意义的,因为 synchronized 关键字可以保证(更好)一次只有一个线程运行该方法。
-
那么我什么时候需要在同步方法中使用这些变量?
-
你不需要,除非你创建一个非常复杂的方法,其中包含不同的块,这取决于一个线程是否完成了另一个块。但这只是糟糕的设计。或者,如果
accessFree是通过另一种方法(例如冻结帐户的方法,但这也不是好的设计)进行操作。 -
“如果他尝试拿 100 美元而只有 50 美元,他将不得不等到其他银行家存款” - 在这种情况下,您打算抛出异常对吗?
-
JamesB - 不,我希望他们等到其他银行家存钱...
标签: java synchronized