[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-mnogopotochnost-v-chyom-raznitsa-mezhdu-konkurentsiey-i-parallelizmom":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":21,"progress":22,"seo":23},273,"v-chyom-raznitsa-mezhdu-konkurentsiey-i-parallelizmom",8,"mnogopotochnost","Многопоточность","🔀","В чём разница между конкуренцией и параллелизмом?","Конкуренция (concurrency) — это способность системы управлять несколькими задачами, переключаясь между ними, при этом задачи не обязательно выполняются одновременно. Параллелизм (parallelism) — это одновременное выполнение нескольких вычислений, как правило, на нескольких процессорных ядрах.\n\n> Аналогия из жизни: конкуренция — один повар готовит несколько блюд, переключаясь между ними. Параллелизм — несколько поваров одновременно готовят части одного банкета.\n\n### Сравнение\n\n| Критерий | Конкуренция (Concurrency) | Параллелизм (Parallelism) |\n|---|---|---|\n| Суть | Управление несколькими задачами | Одновременное выполнение частей задачи |\n| Потоки управления | Обязательно несколько (Thread, корутина) | Необязательно несколько потоков управления |\n| Детерминированность | Результат недетерминирован — зависит от порядка выполнения и синхронизации | Может быть детерминированным (например, параллельное умножение элементов массива) |\n| Количество ядер | Возможна на одном ядре (переключение контекста) | Требует нескольких ядер |\n| Пример в Java | `ExecutorService` с несколькими потоками, обрабатывающими разные запросы | `parallelStream()`, Fork\u002FJoin для разбиения одной задачи |\n\n### Пример\n\n```java\n\u002F\u002F Конкуренция: два потока обрабатывают разные задачи\nExecutorService executor = Executors.newFixedThreadPool(2);\nexecutor.submit(() -> handleRequest(request1));\nexecutor.submit(() -> handleRequest(request2));\n\n\u002F\u002F Параллелизм: одна задача разбивается на части\nlong sum = LongStream.rangeClosed(1, 1_000_000)\n    .parallel()\n    .sum();\n```\n\n### Вывод\n\nКонкуренция — это структура программы (как организовать работу с несколькими задачами), параллелизм — это свойство выполнения (одновременная работа на нескольких ядрах). Программа может быть конкурентной, но не параллельной (один процессор, переключение контекста), и наоборот — параллельной, но не конкурентной (SIMD-инструкции).\n\n> **На собеседовании:** классический вопрос — дать определения и привести примеры. Помните формулу Роба Пайка: «Concurrency is about dealing with lots of things at once. Parallelism is about doing lots of things at once.»","","senior",[15,16,17,18,19,20],"ScopedValue","Java-21","контекст","ThreadLocal","Virtual-Threads","concurrency",[],null,{"title":24,"description":25,"ogTitle":26,"ogDescription":27,"keywords":28,"schemaAnswer":34,"featuredSnippetReady":35},"ScopedValue vs ThreadLocal в Java 21 — ключевые различия — Gymterview","ScopedValue — иммутабельный, автоматически очищается, оптимизирован для Virtual Threads. ThreadLocal — мутабельный, требует remove(), проблемы с памятью.","ScopedValue vs ThreadLocal — что выбрать в Java 21?","ScopedValue иммутабелен и автоматически очищается. ThreadLocal мутабелен и требует ручного remove(). Для Virtual Threads рекомендуется ScopedValue.",[29,30,31,32,33],"ScopedValue Java","ScopedValue vs ThreadLocal","ThreadLocal проблемы","Virtual Threads контекст","JEP 464","ScopedValue (JEP 464, preview Java 21+) иммутабелен в пределах scope, автоматически очищается при выходе из runWhere\u002FcallWhere, оптимизирован для чтения без хэш-таблицы. ThreadLocal мутабелен (set\u002Fget\u002Fremove), живёт пока жив поток, часто вызывает утечки при забытом remove(). ScopedValue автоматически доступен в StructuredTaskScope.fork(). При миллионах Virtual Threads ThreadLocal создаёт огромное потребление памяти.",true]