文章详情

背景

假设我们正在开发一个在线银行系统,一个关键功能是用户账户的转账操作。在转账过程中,系统需要检查账户余额是否足够,余额充足,则执行转账;余额不足,则返回错误信息。下面是一个简化的Java代码片段,用于处理转账逻辑:

java

public class TransferService {

public String transferMoney(String fromAccount, String toAccount, double amount) {

double fromBalance = getBalance(fromAccount);

double toBalance = getBalance(toAccount);

if (fromBalance >= amount) {

// 执行转账操作

setBalance(fromAccount, fromBalance – amount);

setBalance(toAccount, toBalance + amount);

return "Transfer successful";

} else {

return "Insufficient funds";

}

}

private double getBalance(String account) {

// 模拟获取账户余额的方法

return 1000.0; // 假设所有账户余额都是1000.0

}

private void setBalance(String account, double newBalance) {

// 模拟设置账户余额的方法

}

}

提出

在上面的代码中,有一个业务逻辑BUG。请这个BUG,并说明如何修复它。

BUG

在上述代码中,`getBalance`方法被调用了两次,分别在获取`fromAccount`和`toAccount`的余额时。账户余额在两次查询之间发生变化(另一个线程正在执行转账操作),`fromBalance`和`toBalance`可能会出现不一致的情况,导致转账失败或者错误地执行转账。

修复方案

为了修复这个BUG,我们可以采取步骤:

1. 使用同步代码块来确保在获取账户余额和更新账户余额时,不会有其他线程操作这些数据。

2. 在同步块内,先更新`fromAccount`的余额,再更新`toAccount`的余额。

3. 在更新`fromAccount`的余额时余额不足,则不需要继续执行转账操作,直接返回错误信息。

下面是修复后的代码:

java

public class TransferService {

public String transferMoney(String fromAccount, String toAccount, double amount) {

synchronized (fromAccount) {

synchronized (toAccount) {

double fromBalance = getBalance(fromAccount);

double toBalance = getBalance(toAccount);

if (fromBalance >= amount) {

// 执行转账操作

setBalance(fromAccount, fromBalance – amount);

setBalance(toAccount, toBalance + amount);

return "Transfer successful";

} else {

return "Insufficient funds";

}

}

}

}

private double getBalance(String account) {

// 模拟获取账户余额的方法

return 1000.0; // 假设所有账户余额都是1000.0

}

private void setBalance(String account, double newBalance) {

// 模拟设置账户余额的方法

}

}

在这个修复方案中,我们使用了两层同步,确保了在执行转账操作时,账户余额的一致性。外层同步块确保了在修改任何账户余额之前,不会有其他线程正在修改账户余额。内层同步块确保了`fromAccount`和`toAccount`的余额获取和更新是原子操作,防止了并发修改的。

通过这样的修改,我们可以确保即使在多线程环境下,转账操作也是线程安全的,可以正确处理余额不足的情况。

相关推荐
2024年购车指南:10万新能源车销量排行榜深度解析
入门级新能源市场为何火爆? 随着电池技术的成熟与制造成本的下降,10万元的新能源汽车市场正成为整个行业增长最迅猛的板块。对于众多首次购车或追…
头像
展示内容 2025-12-06
续航600km8万左右纯电车suv推荐
第一款是广汽新能源AION LX(参数|询价)。广汽新能源Aion LX是国产品牌中,首款续航里程表现超过600km的国产量产纯电动SUV车…
头像
展示内容 2025-12-06
全球首破160km/h!腾势N9以双倍国际标准刷新鱼钩测试纪录
在交通事故中,车辆侧翻是最危险的事故之一。 有研究表明,由车辆侧翻导致的死亡人数占到交通事故总死亡人数的35%。 特别是中大型SUV,由于其…
头像
展示内容 2025-03-26
足球怎么踢
摘要:足球,这项全球最受欢迎的运动,其踢法丰富多彩,本文将详细介绍足球怎么踢,帮助读者更好地理解这项运动。 一、基本技巧 1. 脚法训练 足…
头像
展示内容 2025-03-18
发表评论
暂无评论

还没有评论呢,快来抢沙发~