Sobes.tech
Назад к вопросам
Junior — Middle
58

Как различаются понятия синхронности и параллельности в программировании?

Компании, где спрашивали
OZONOZON

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Синхронность — это способ выполнения, при котором следующая операция начинается после завершения предыдущей. Параллельность — это одновременное выполнение нескольких задач, если есть для этого ресурсы. Важно показать, что это разные оси: синхронность/асинхронность про ожидание, а параллельность — про одновременность исполнения.

Определение:

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

В C# синхронный код может выполняться последовательно в одном потоке, а параллельный — распределяться между несколькими потоками через Task, Parallel, ThreadPool и т.п. При этом асинхронность не равна параллельности: async/await может не создавать параллельного выполнения, а только не блокировать поток во время ожидания I/O.

Пример использования:

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

using System;
using System.Threading.Tasks;

class Program
{
    static void Main()
    {
        // Синхронно: один за другим
        LoadA();
        LoadB();

        // Параллельно: одновременно
        var taskA = Task.Run(() => LoadA());
        var taskB = Task.Run(() => LoadB());

        Task.WaitAll(taskA, taskB);
    }

    static void LoadA()
    {
        Console.WriteLine("LoadA started");
        Task.Delay(1000).Wait();
        Console.WriteLine("LoadA finished");
    }

    static void LoadB()
    {
        Console.WriteLine("LoadB started");
        Task.Delay(1000).Wait();
        Console.WriteLine("LoadB finished");
    }
}

Пояснение кода:

В синхронной части LoadA() вызывается, затем только после завершения вызывается LoadB(). Это последовательное выполнение: пока первый метод не закончится, второй не начнётся.

В параллельной части Task.Run отправляет оба действия в пул потоков. После этого Task.WaitAll ждёт завершения обоих задач. В результате LoadA и LoadB могут выполняться одновременно, если планировщик выделит им отдельные потоки.

Важно понимать, что здесь Task.Delay(1000).Wait() используется только как простой способ имитировать работу; в реальном коде лучше использовать async/await, если речь про ожидание I/O.

Ключевые моменты:

  • Синхронность — про порядок и блокировку: следующий шаг ждёт завершения предыдущего.
  • Параллельность — про одновременное выполнение нескольких задач.
  • Асинхронность и параллельность — не одно и то же: async не означает multi-threading.
  • Параллельность чаще полезна для CPU-bound задач и независимых операций.
  • Для I/O-bound задач часто важнее асинхронность, чем параллельность.
  • На собеседовании полезно отдельно проговорить разницу между синхронностью/асинхронностью и параллельностью/последовательностью.