Java · 32 строк
transfer вызывают 64 потока обработки платежей. Клиенты часто переводят деньги друг другу в обе стороны: между своими счетами, мужу и обратно.
Отметьте строки с ошибками.
В работе: Ядро переводов между счетами внутри банка.
Как проверяем
Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Плюс 1 вопрос про поведение программы — на зачёт не влияют. Ответ один на подход: после него показываем разбор.
Источник: Т‑Банк: секция Java, многопоточность — исправить код. Условие пересказано своими словами.
Давали на собеседовании?
Ответов пока мало — ваш поможет.
import java.math.BigDecimal;public class TransferService {static class Account {final long id;BigDecimal balance;Account(long id, BigDecimal balance) {this.id = id;this.balance = balance;}}// Вызывается из пула обработчиков платежей.public void transfer(Account from, Account to, BigDecimal amount) {if (from.balance.compareTo(amount) < 0) {throw new IllegalStateException("Недостаточно средств на счёте " + from.id);}synchronized (from) {synchronized (to) {from.balance = from.balance.subtract(amount);to.balance = to.balance.add(amount);}}}// Сумма по двум счетам для виджета «Все деньги».public BigDecimal total(Account a, Account b) {return a.balance.add(b.balance);}}