Войти Регистрация
Конкурентность

28. Чистка отменённых автоплатежей в СберБанк Онлайн

Лёгкая

Java · 35 строк

У клиента в среднем 4 автоплатежа: связь, ЖКХ, интернет, детский сад. Список читают приложение и планировщик списаний, новые автоплатежи добавляются из другого потока.

Отметьте строки с ошибками.

В работе: Сервис автоплатежей, экран «Скоро спишется» и ночная чистка.

Как проверяем Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Плюс 2 вопроса про поведение программы — на зачёт не влияют. Ответ один на подход: после него показываем разбор.
ConcurrentModificationExceptionsynchronizedListитератор

Источник: наша задача на данных Сбера: автоплатежи клиента. Условие пересказано своими словами.

  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.List;
  4. public class AutopayService {
  5. record Autopay(long id, String payee, long amountRub, boolean cancelled) {}
  6. private final List<Autopay> autopays =
  7. Collections.synchronizedList(new ArrayList<>());
  8. public void add(Autopay a) {
  9. autopays.add(a);
  10. }
  11. // Чистка отменённых, раз в сутки.
  12. public void purgeCancelled() {
  13. for (Autopay a : autopays) {
  14. if (a.cancelled()) {
  15. autopays.remove(a);
  16. }
  17. }
  18. }
  19. // Сумма списаний на 25-е число для экрана «Скоро спишется».
  20. public long monthlyTotal() {
  21. long sum = 0;
  22. for (Autopay a : autopays) {
  23. if (!a.cancelled()) {
  24. sum += a.amountRub();
  25. }
  26. }
  27. return sum;
  28. }
  29. }