Что такое многопоточность (multithreading) в Java?

«Что такое многопоточность (multithreading) в Java?» — вопрос из категории Java Core, который задают на 23% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Многопоточность — это модель выполнения, при которой в рамках одного процесса Java (JVM) параллельно работают несколько потоков (threads). Потоки разделяют общую память процесса (heap), но имеют собственные стеки вызовов и локальные переменные.

Преимущества:

  • Повышение производительности: Использование нескольких ядер CPU для вычислений.
  • Улучшение отзывчивости: Главный поток (например, UI) не блокируется длительными операциями (I/O, сетевые запросы).
  • Эффективное использование ресурсов: Пока один поток ожидает I/O, другие могут выполняться.

Базовый пример создания потока:

// 1. Наследование от Thread
class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("Поток работает: " + getName());
    }
}
// Запуск: new MyThread().start();

// 2. Реализация Runnable (предпочтительнее)
Runnable task = () -> {
    System.out.println("Поток работает: " + Thread.currentThread().getName());
};
// Запуск: new Thread(task).start();

Ключевые проблемы и решения:

Проблема Описание Решение в Java
Гонка данных (Race Condition) Непредсказуемый результат из-за порядка выполнения потоков. Синхронизация (synchronized), атомарные классы (AtomicInteger).
Взаимная блокировка (Deadlock) Два и более потока бесконечно ждут друг друга. Упорядоченное захватывание блокировок, использование tryLock с таймаутом.
Видимость изменений Изменения переменной одним потоком не видны другому. Ключевое слово volatile, синхронизация.

Для сложных задач используйте высокоуровневые API из пакета java.util.concurrent (пулы потоков, ExecutorService, Future, ConcurrentHashMap).