Какие основные компоненты пакета java.util.concurrent вы использовали и для чего?

«Какие основные компоненты пакета java.util.concurrent вы использовали и для чего?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

java.util.concurrent (JUC) — это основной пакет Java для безопасного и эффективного параллельного программирования. Его ключевые компоненты:

1. Executor Framework (Управление потоками)

  • ExecutorService и пулы потоков (ThreadPoolExecutor, ScheduledThreadPoolExecutor) для управления жизненным циклом потоков и выполнения задач.
    ExecutorService executor = Executors.newFixedThreadPool(4);
    executor.submit(() -> processData(data));
    executor.shutdown();

2. Потокобезопасные коллекции (Concurrent Collections)

  • ConcurrentHashMap: Высокопроизводительная хэш-таблица с сегментированной блокировкой.
  • CopyOnWriteArrayList: Оптимален для частого чтения и редкой записи.
  • BlockingQueue (ArrayBlockingQueue, LinkedBlockingQueue): Для реализации паттерна "Producer-Consumer".

3. Синхронизаторы (Synchronizers)

  • CountDownLatch: Ожидание завершения набора операций (одноразовый).
  • CyclicBarrier: Синхронизация группы потоков в общей точке (многоразовый).
  • Semaphore: Ограничение числа потоков, одновременно получающих доступ к ресурсу.
  • Exchanger: Обмен данными между двумя потоками.

4. Атомарные классы (Atomic Variables)

  • AtomicInteger, AtomicLong, AtomicReference: Для атомарных операций (например, incrementAndGet()) без явных блокировок, используя CAS (Compare-And-Swap).

5. Future и CompletableFuture

  • Future: Представляет результат асинхронной операции.
  • CompletableFuture: Позволяет создавать цепочки асинхронных задач, комбинировать их и обрабатывать исключения.

Ключевые принципы использования:

  • Выбор инструмента под задачу (например, ConcurrentHashMap вместо Collections.synchronizedMap).
  • Понимание отношений happens-before, гарантируемых этими классами.
  • Избегание deadlock'ов (упорядочивание блокировок) и race conditions (использование атомарных операций).