#423 Код-ревью многопоточного перевода денег
Проверить корректность реализации для работы в многопоточке, найти проблемы в коде:
public class TransferProblem {
public class Account {
final long id;
BigDecimal balance;
BigDecimal maxBalance;
public Account(
final long id,
final BigDecimal balance,
final BigDecimal maxBalance
) {
this.id = id;
this.balance = balance;
this.maxBalance = maxBalance;
}
}
public boolean transferMoney(
final Account src, final Account dst, final BigDecimal value
) {
if (value.compareTo(BigDecimal.ZERO) < 0) {
return false;
}
synchronized (src) {
synchronized (dst) {
if (src.balance.compareTo(value) < 0) {
return false;
}
if (
(dst.balance.add(value)).compareTo(dst.maxBalance) > 0
) {
return false;
}
src.balance = src.balance.subtract(value);
dst.balance = dst.balance.add(value);
}
}
return true;
}
}
Разбор вопроса
Войди, чтобы начать диалог
Ментор ведёт диалог по текущему вопросу и учитывает предыдущие сообщения.
Войти
Доступно с Premium
Это лишь одно из решений, доступных с Premium. А ещё:
- 250+ продвинутых лекций
- 1300+ практических заданий
- 500+ решений задач с реальных собеседований
- Именные сертификаты Java Hub
- Расширенный доступ к AI-ментору