gpt4 book ai didi

java - 为什么线程仍然不一致?

转载 作者:行者123 更新时间:2023-11-29 08:14:03 25 4
gpt4 key购买 nike

我有一些模拟银行转账的 Java 代码。帐户类只有一个余额字段和一个向余额字段添加一些余额的转帐方法。

TransferManager 定义了一个 Transfer 类,它采用两个 Account 对象将给定金额从一个帐户转移到另一个帐户,并作为参数传递。

Manager 本身有两个重要的方法需要同步,因为它们都操作同一个资源,它们将以线程的方式调用:

public synchronized void issueTransfer(Account from, Account to, int amount) {
openTransfers.add(new Transfer(from, to, amount));
issuedTransfers++;
}

public synchronized void performTransfers() {
for(Transfer transaction : openTransfers) {
transaction.performTransfer();
performedTransfers++;
}
openTransfers.clear();
}

这里没有同步语句,我在存储和读取传输的数组列表上得到 NullPointerExceptions。

BankTest 生成 10 个线程,每个线程发出 10 次传输。看看 BankTest.java 就知道了。问题是并不总是发出 10*10 次转账。有时有 98 或 99:

enter image description here

我必须向 BankTest.java 添加同步吗?我应该怎么办?还有其他想法或建议吗?

TransferManager.java:http://pastebin.com/Je4ExhUz

BankTest.java:http://pastebin.com/cdpWhHPb

Exersice3.java:http://pastebin.com/v7pwJ5T1

帐户.java:http://pastebin.com/QYEeWy5Z

最佳答案

try {
Thread.sleep(60);
} catch (InterruptedException e) {
e.printStackTrace();
}

这并不能保证所有线程都完成

而是将所有线程保存在一个列表中,并对所有线程调用 join

try {
for(Thread thr:threads)thr.join();
} catch (InterruptedException e) {
e.printStackTrace();
}

关于java - 为什么线程仍然不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5928432/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com