Что такое многопоточность в рамках одного процесса?

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

Ответ

Да, многопоточная программа выполняется в рамках одного процесса. Потоки (threads) разделяют общие ресурсы процесса (память, открытые файлы), но имеют собственные стеки вызовов и программные счётчики.

Как создать поток в Java:

  1. Наследование от Thread:
    class MyThread extends Thread {
        @Override
        public void run() {
            System.out.println("Поток работает: " + getName());
        }
    }
    // Запуск
    new MyThread().start();
  2. Реализация Runnable (предпочтительнее):
    class MyTask implements Runnable {
        @Override
        public void run() {
            System.out.println("Задача выполняется");
        }
    }
    // Запуск
    new Thread(new MyTask()).start();
    // Или с лямбдой
    new Thread(() -> System.out.println("Лямбда-поток")).start();

Важные аспекты:

  • Конкурентный доступ: Потоки могут одновременно обращаться к общим данным, что требует синхронизации.
  • Механизмы синхронизации:
    • Ключевое слово synchronized (для методов или блоков).
    • Классы из пакета java.util.concurrent.locks (ReentrantLock).
    • Атомарные классы (AtomicInteger).
  • Планирование: Порядок и время выполнения потоков управляются планировщиком ОС и JVM, что делает его недетерминированным.