【发布时间】:2015-04-23 18:57:04
【问题描述】:
我必须制作一个非常简化的联合银行账户程序(在此示例中,有 3 个用户都可以访问银行账户资源),但我无法正确使用 Java 线程。
这是程序的工作方式。有些“用户”都可以访问一个具有任意设置初始余额的联合银行账户(我使用了 5000)。每人一次可以取款或存款(取款或存款每次随机产生)3次。
他们存款或取款的金额也是随机生成的,唯一的规则是金额不能超过当前余额的1/3。
最后,在每个事务之后,当前线程必须“等待”1 到 10 秒之间的随机秒数。
现在是令人困惑的部分。我们的老师要求我们创建一个独特的 NotEnoughBalance 异常类,以防某个用户以某种方式提取的钱比当前帐户中的钱多(但这是我的第一个困惑点:由于 1/3rd,理论上这永远不会发生规则)。
下面是粘贴在 pastebin 上的完整代码:
目前,当我运行主程序时:
public class BankAccount{
public static void main(String[] args) throws InterruptedException{
int capital = 5000;
JointBankAccount acc = new JointBankAccount(capital);
Thread t1 = new Thread(new Owner("Josh", acc));
Thread t2 = new Thread(new Owner("Wade", acc));
Thread t3 = new Thread(new Owner("Ben", acc));
System.out.println(capital);
String tname = Thread.currentThread().getName();
System.out.println(tname);
t1.start();
t2.start();
t3.start();
t1.join();
t2.join();
t3.join();
for(AccountTransaction s : acc.history){
System.out.println(s.toString());
}
System.out.println(acc.getBalance());
}
}
我有时会随机在 System.out.println(s.toString()) 处遇到 NPE 异常。
如果我将存款和取款功能同步,这是完全可以解决的。
问题是,不知何故,我认为让他们同步违背了我们老师所要求的目的。如果我让它们同步,那么我觉得我确保每次提款都能成功遵循 1/3 规则,并且永远不会存在余额不足异常。
当我删除同步时我得到 NPE 的事实也让我认为错误可能在于我在异常发生时没有正确处理异常。我不知道。
任何帮助将不胜感激。
【问题讨论】:
-
如果你没有
synchronized任何东西,那么就没有原子性或可见性保证。你几乎肯定有种族危险。 -
有时有些东西是永远不会扔的。有人见过
InternalError或UnknownError被抛出吗? -
你的意思是在运行这个程序时?没有
-
@user1966576 我的意思是,正确同步,将
NotEnoughBalanceException添加到您的代码中但永远不要抛出它(即在false == true时抛出它)。 -
如果我更改规则以便我在开始时保留 5000 资本,但提取或存入的金额可以是 3000 之间的随机数(因此不再有 1/3 规则),则错误正确发生并被抛出。我刚试过。我想我的老师可能把作业给错了。就像他希望发生种族危险,但感觉如果不同步存取款,程序就没有任何意义,这使得种族危险永远不会发生(使用 1/3 规则)。所以idk。
标签: java multithreading