---
title: Основы многопоточности
seo:
  title: Основы многопоточности — Java Developer
  description: Тема «Основы многопоточности» для собеседования Java Developer. Расскажите о модели памяти в Java. Что такое «потокобезопасность»?
---

[Все темы Java Developer](/java-developer)

## <strong>Расскажите о модели памяти в Java</strong> [#q-14bee738d69b81c793b0ebb889d6f357]

Модель памяти в Java определяет, как потоки взаимодействуют через память и как изменения переменных в одном потоке становятся видимыми для других потоков. Основные концепции&#58;

{/* prettier-ignore */}
1. <strong>Основные области памяти&#58;</strong>

    - <code>Heap</code> <strong>(Куча)&#58;</strong> Все объекты и массивы хранятся здесь.

    - <code>Stack</code> <strong>(Стек)&#58;</strong> Хранит примитивные данные и ссылки на объекты, находящиеся в куче, для каждого потока.

1. <strong>Видимость и упорядочивание&#58;</strong>

    - <code>volatile</code><strong>&#58;</strong> Ключевое слово, которое гарантирует видимость изменений переменной для всех потоков. Изменения в <code>volatile</code> переменной сразу становятся видимыми другим потокам.

    - <code>synchronized</code><strong>&#58;</strong> Блокировка, которая гарантирует, что только один поток может выполнять блок кода в одно время. Также обеспечивает видимость изменений, выполненных в блоке.

1. <strong>Порядок выполнения&#58;</strong>

    - <code>happens&#45;before</code><strong>&#58;</strong> Принцип, который гарантирует, что одно действие происходит до другого. Если одно действие <code>happens&#45;before</code> другого, то первое действие будет видно и упорядочено перед вторым.

    - Примеры <code>happens&#45;before</code>&#58;

        - Блокировка и разблокировка монитора.

        - Запись в <code>volatile</code> переменную и последующее чтение этой переменной.

1. <strong>Атомарные операции&#58;</strong>

    - Операции, которые выполняются целиком и не могут быть прерваны другим потоком.

    - Класс <code>java&#46;util&#46;concurrent&#46;atomic</code> предоставляет атомарные классы, такие как <code>AtomicInteger</code>, <code>AtomicReference</code>, и т.д.

1. <strong>Переменная</strong> <code>final</code><strong>&#58;</strong>

    - Значения <code>final</code> переменных устанавливаются только один раз и становятся видимыми для всех потоков после завершения конструктора.

:::note[Ссылки для изучения]

1. [Многопоточность в Java](https://javarush.com/groups/posts/1992-mnogopotochnostjh-v-java-sutjh-pljusih-i-chastihe-lovushki-)
   :::

---

## <strong>Что такое «потокобезопасность»?</strong> [#q-14bee738d69b81f496b0efb639116138]

Потокобезопасность (<code>thread safety</code>) — это свойство программы или компонента, которое позволяет им корректно работать в многопоточной среде, то есть, когда к ним одновременно обращаются несколько потоков.

#### Основные аспекты потокобезопасности

{/* prettier-ignore */}
1. <strong>Изоляция данных&#58;</strong>

    - Обеспечение того, что каждый поток работает с собственным набором данных, что исключает возможность одновременного доступа к одним и тем же данным.

1. <strong>Синхронизация&#58;</strong>

    - Использование механизмов синхронизации (например, <code>synchronized</code> блоков или методов) для контроля доступа к общим ресурсам. Это предотвращает состояние гонки, когда несколько потоков одновременно изменяют одни и те же данные.

    - Пример&#58;

        ```java
        public synchronized void increment() {
            count++;
        }
        ```

1. <strong>Использование</strong> <code>volatile</code><strong>&#58;</strong>

    - volatile задаёт гарантии видимости и порядка согласно Java Memory Model. Оно не делает count++ атомарным и не описывается просто как запрет кэширования.

    - Пример&#58;

        ```java
        private volatile boolean flag;
        ```

1. <strong>Атомарные операции&#58;</strong>

    - Атомарные операции выполняются полностью или не выполняются вовсе, без промежуточных состояний, что предотвращает проблемы синхронизации.

    - Классы из пакета <code>java&#46;util&#46;concurrent&#46;atomic</code> предоставляют атомарные операции.

    - Пример&#58;

        ```java
        AtomicInteger count = new AtomicInteger(0);
        count.incrementAndGet();
        ```

1. <strong>Использование коллекций из</strong> <code>java&#46;util&#46;concurrent</code><strong>&#58;</strong>

    - Коллекции, такие как <code>ConcurrentHashMap</code>, обеспечивают потокобезопасность при работе с данными.

    - Пример&#58;

        ```java
        ConcurrentMap<String, Integer> map = new ConcurrentHashMap<>();
        map.put("key", 1);
        ```

#### Пример проблемы потокобезопасности

Без синхронизации возможны проблемы, как в примере ниже&#58;

```java
public class Counter {
    private int count = 0;

    public void increment() {
        count++;
    }

    public int getCount() {
        return count;
    }
}
```

В многопоточной среде несколько потоков могут одновременно вызывать <code>increment</code>, что приведет к некорректному значению <code>count</code>. Для обеспечения потокобезопасности, метод <code>increment</code> нужно синхронизировать&#58;

```java
public class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public synchronized int getCount() {
        return count;
    }
}
```

Таким образом, потокобезопасность достигается за счет контроля доступа потоков к общим ресурсам и данных, что предотвращает некорректное поведение программы.

:::note[Ссылки для изучения]

1. [Многопоточность в Java](https://javarush.com/groups/posts/1992-mnogopotochnostjh-v-java-sutjh-pljusih-i-chastihe-lovushki-)
   :::

---

## <strong>Чем отличается процесс от потока?</strong> [#q-14bee738d69b8143986dcac5bc7e17f2]

<strong>Основные отличия процесса от потока&#58;</strong>

#### Процесс

1. <strong>Определение&#58;</strong> Независимая программа с собственным
   адресным пространством.

1. <strong>Изоляция&#58;</strong> Полная изоляция от других процессов.

1. <strong>Ресурсы&#58;</strong> Имеет собственные ресурсы (память, дескрипторы
   файлов).

1. <strong>Коммуникация&#58;</strong> Использует межпроцессное взаимодействие
   (IPC) для связи.

1. <strong>Пример&#58;</strong> Два запущенных экземпляра браузера.

#### Поток

1. <strong>Определение&#58;</strong> Единица выполнения внутри процесса.

1. <strong>Изоляция&#58;</strong> Делит память и ресурсы с другими потоками того
   же процесса.

1. <strong>Ресурсы&#58;</strong> Разделяет ресурсы родительского процесса.

1. <strong>Коммуникация&#58;</strong> Легко взаимодействует с другими потоками
   через общую память.

1. <strong>Пример&#58;</strong> Многопоточный веб-сервер, обрабатывающий
   запросы.

#### Краткий итог

- <strong>Процессы&#58;</strong> Изолированы, имеют свои ресурсы, сложная
  коммуникация.

- <strong>Потоки&#58;</strong> Разделяют ресурсы, простая коммуникация,
  легковесные.

:::note[Ссылки для изучения]

1. [Многопоточность в Java](https://javarush.com/groups/posts/1992-mnogopotochnostjh-v-java-sutjh-pljusih-i-chastihe-lovushki-)
   :::

---

## <strong>В чём разница между «конкуренцией» и «параллелизмом»?</strong> [#q-14bee738d69b8104a030d953531f522f]

<strong>Основная разница между «конкуренцией» и «параллелизмом»&#58;</strong>

#### Конкуренция (<code>Concurrency</code>)

1. <strong>Определение&#58;</strong> Возможность системы выполнять несколько
   задач, переключаясь между ними. Не обязательно выполнение задач одновременно.

1. <strong>Цель&#58;</strong> Улучшение эффективности и отзывчивости системы.

1. <strong>Пример&#58;</strong> Веб-сервер, который обрабатывает множество
   запросов, переключаясь между ними.

#### Параллелизм (<code>Parallelism</code>)

1. <strong>Определение&#58;</strong> Одновременное выполнение нескольких задач
   на нескольких процессорах или ядрах.

1. <strong>Цель&#58;</strong> Ускорение выполнения задач за счет их выполнения
   одновременно.

1. <strong>Пример&#58;</strong> Обработка большого массива данных с
   использованием нескольких ядер процессора.

#### Краткий итог

- <strong>Конкуренция&#58;</strong> Многозадачность с переключением, не
  обязательно одновременное выполнение.

- <strong>Параллелизм&#58;</strong> Одновременное выполнение задач на нескольких
  процессорах/ядрах.

:::note[Ссылки для изучения]

1. [Многопоточность в Java](https://javarush.com/groups/posts/1992-mnogopotochnostjh-v-java-sutjh-pljusih-i-chastihe-lovushki-)
   :::

---

## <strong>Что такое «зелёные потоки» и есть ли они в Java?</strong> [#q-14bee738d69b8159b096d6caf0109000]

<strong>Зелёные потоки и их использование в Java&#58;</strong>

#### Зелёные потоки

{/* prettier-ignore */}
- <strong>Определение&#58;</strong> Потоки, управляемые виртуальной машиной (<code>JVM</code>), а не операционной системой.

- <strong>Преимущества&#58;</strong>

    - Низкие накладные расходы на создание и переключение.

    - Эффективны на системах с ограниченными ресурсами.

- <strong>Недостатки&#58;</strong>

    - Не могут использовать преимущества многопроцессорных систем, так как все выполняются в одном системном потоке.

#### Зелёные потоки в Java

{/* prettier-ignore */}
- <strong>Современная Java&#58;</strong>

    - Современная Java поддерживает платформенные и виртуальные потоки. Платформенные потоки обычно соответствуют потокам ОС; виртуальные планирует JVM.

- <strong>Проект Loom&#58;</strong>

    - Виртуальные потоки вошли в Java 21 как завершённая возможность. JVM планирует множество виртуальных потоков на платформенных потоках; это позволяет масштабировать прежде всего задачи с ожиданием ввода-вывода.

    - <strong>Цель&#58;</strong> Создание лёгких потоков для повышения конкурентности и производительности, позволяя легко создавать тысячи или миллионы потоков с минимальными накладными расходами.

:::note[Ссылки для изучения]

1. [Многопоточность в Java](https://javarush.com/groups/posts/1992-mnogopotochnostjh-v-java-sutjh-pljusih-i-chastihe-lovushki-)
   :::
