#423 Код-ревью многопоточного перевода денег

Компании:
Неизвестная
Темы:
JavaМногопоточностьКод ревью

Проверить корректность реализации для работы в многопоточке, найти проблемы в коде:

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;
    }
}

Разбор вопроса

Ментор
Ответь как на реальном собеседовании. Я задам уточняющие вопросы, а затем сравню твой ответ с эталонным и покажу точность в %.
Войди, чтобы начать диалог Ментор ведёт диалог по текущему вопросу и учитывает предыдущие сообщения.
Войти