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

14. Счётчик избранного на ConcurrentHashMap

Лёгкая

Java · 35 строк

Счётчик «добавили в избранное» показывается продавцу в статистике объявления. Программа ниже воспроизводит нагрузку: 10 000 добавлений одного объявления в 8 потоков.

Отметьте строки с ошибками и ответьте, что выведет main.

В работе: Статистика объявления в кабинете продавца.

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

Источник: на задачах Авито: избранные объявления. Условие пересказано своими словами.

Давали на собеседовании? Ответов пока мало — ваш поможет.
  1. import java.util.Map;
  2. import java.util.concurrent.ConcurrentHashMap;
  3. import java.util.concurrent.ExecutorService;
  4. import java.util.concurrent.Executors;
  5. import java.util.concurrent.TimeUnit;
  6. public class FavoritesCounter {
  7. private final Map<Long, Integer> favorites = new ConcurrentHashMap<>();
  8. // Пользователь добавил объявление в избранное.
  9. public void add(long itemId) {
  10. Integer current = favorites.get(itemId);
  11. if (current == null) {
  12. favorites.put(itemId, 1);
  13. } else {
  14. favorites.put(itemId, current + 1);
  15. }
  16. }
  17. public int get(long itemId) {
  18. return favorites.get(itemId);
  19. }
  20. public static void main(String[] args) throws InterruptedException {
  21. FavoritesCounter c = new FavoritesCounter();
  22. ExecutorService pool = Executors.newFixedThreadPool(8);
  23. for (int i = 0; i < 10_000; i++) {
  24. pool.submit(() -> c.add(42L));
  25. }
  26. pool.shutdown();
  27. pool.awaitTermination(10, TimeUnit.SECONDS);
  28. System.out.println(c.get(42L));
  29. System.out.println(c.get(43L));
  30. }
  31. }