Многопоточное программирование, или, в более широком смысле, параллельное программирование, — очень сложный и подверженный ошибкам способ программирования, но почему мы рискуем кропотливо изучать различные приемы многопоточного программирования и решать различные проблемы параллелизма?
Поскольку параллелизм является основой всего распределенного кластера, распределенный кластер может не только значительно снизить стоимость той же емкости нагрузки, но и значительно увеличить верхний предел общей масштабируемой емкости нагрузки. Низкая стоимость услуг привела к взрыву креативности интернет-индустрии, и каждый может создать и поддерживать службу приложений, которая обслуживает сотни тысяч или даже десятки тысяч человек; а чрезвычайно высокий предел пропускной способности службы сделал онлайнизация бесчисленного множества предприятий Возможно, значительно расширяя границы интернет-технологий и бизнеса.
Можно сказать, что многопоточное программирование является основой и ядром в этой обширной технической области параллелизма, и большинство абстрактных проблем параллелизма задумываются и решаются на основе многопоточной модели. И суть этих проблем параллелизма одна и та же. Будь то параллелизм потоков, параллелизм процессов или параллелизм на уровне сервера, все они имеют схожие характеристики и сталкиваются с похожими проблемами. Многопоточное программирование — это то, что мы врубаем в эту область и изучаем решения к проблемам параллелизма лучший способ. Таким образом, в современной компьютерной индустрии многопоточное программирование является не только важной областью знаний для технических собеседований и улучшений Java-программистов, но и входным билетом для внутренних программистов, которые могут постучаться в дверь реализации распределенной системы. Если вы не можете понять характеристики и проблемы параллельных программ, вам будет трудно быть компетентным в разработке распределенных систем.
Эта статья представляет собой набор статей в серии, поэтому от читателей не требуется иметь фундамент, связанный с многопоточностью. В этой статье шаг за шагом в разумном порядке будут представлены все аспекты многопоточного программирования на Java, а также объяснены концепция, использование, принцип и реализация многопоточного программирования от поверхностного к более глубокому. В каждой части есть краткое введение в соответствующую тему, а затем оно сопоставляется со ссылкой на статью для подробного объяснения.Рекомендуется, чтобы читатели, которые не знают соответствующую тему, могли прочитать статью по ссылке, чтобы понять . Однако, если вы уже знакомы с некоторым содержанием в середине статьи, вы можете просмотреть его и проигнорировать статью по ссылке.Вы можете прочитать эту часть содержания в качестве плана обзора.
Далее в этой статье мы систематически изучим систему знаний о многопоточном программировании на Java, начиная с самых основных базовых концепций и использования потоков, полностью охватывая правильность и эффективность многопоточности. освоить различные навыки многопоточного программирования. После этого статья будет становиться все более и более сложной, мы обсудим подробное разрешение взаимоблокировок, модель, управляемую событиями, базовую реализацию механизма синхронизации, анализ исходного кода пула потоков и другие дополнительные темы, чтобы помочь читателям понять, что это такое. это и почему это так, а затем также не боится проблем, связанных с многопоточностью.
Основы многопоточности
концепция параллелизма
Многопоточность — это прежде всего средство параллелизма, поэтому сначала нам нужно понять основные концепции параллелизма. Параллелизм означает, что несколько исполнителей выполняют разные задачи одновременно. Если этим задачам нужен доступ к одним и тем же данным, будет сгенерированогонка данных. Если контроль параллелизма не может быть выполнен хорошо, тогонка данныхПроблемы могут привести к ошибкам в конечном результате программы, о чем мы часто говоримнесогласованность данных. Например, со счета А необходимо одновременно списать три суммы денег, тогда, если три потока выполняют операцию списания одновременно, возможно, что все три потока используют начальный баланс счета за вычетом значения для вычисления трех результатов и сохранять их в балансе счета, что приводит к взаимному покрытию результатов списания. Помимо многопоточного параллелизма, существуют более важные темы распределенного параллелизма, в том числеАтомарность, критические секции, взаимное исключение, компенсация, итоговые задачии другие профессиональные термины, все это можно объяснить в этой статье «Концепция параллелизма не запутывается в конкретных технических деталях, а только на примерах из жизни.Когда мы говорим «параллелизм, многопоточность», что мы имеем в виду?"чтобы найти ответ.
Основы многопоточного программирования
После понимания основных концепций параллелизма мы можем понять конкретные технологии в области многопоточного программирования. Прежде всего, нам нужно понять, зачем нам многопоточность? Что именно решает многопоточность? Затем мы можем приступить к написанию реального кода многопоточного программирования Java.В начале мы будем напрямую использоватьThread
класс для создания и запуска потоков. Сразу же мы столкнулись с проблемой, вызванной многопоточностью, мы должны использовать механизм синхронизации потоков, чтобы гарантировать, что конечный результат вывода будет правильным.
существует"На этот раз давайте полностью разберемся с многопоточностью Java.«В этой статье мы начнем со сценария многопоточности. Только когда мы поймем, что может играть многопоточность, мы сможем по-настоящему использовать эту важную технологию на практике. Позже мы будем использоватьThread
создать и запустить поток, а затем пройти через самые основныеsychronized
ключевое слово для реализации взаимоисключающего доступа к критическим разделам, реализовать первую правильную многопоточную программу Java в этой серии статей.
Использование пула потоков
Но в реальном процессе разработки мы принципиально не создаем собственныеThread
Затем поток, представленный классом, управляет его выполнением. Вместо этого мы делегируем задачи пулу потоков и позволяем пулу потоков самостоятельно управлять планированием задач и жизненным циклом потоков. Пул потоков похож на большую экономку: пока мы устанавливаем для него правила и бюджеты, он автоматически будет выполнять различные задачи за нас. Если вы хотите хорошо использовать пул потоков, вам нужно только прочитать "Играйте с пулом потоков от 0 до 1"Этой статьи достаточно!
Проблемы, с которыми сталкиваются многопоточные программы
Многопоточные программы сталкиваются со все более и более сложными проблемами, чем однопоточные программы, которые подобны копанию сот. Нам нужна сладость меда, но всегда будьте осторожны, чтобы не обжечься по всему лицу. Вообще говоря, многопоточные программы будут сталкиваться с тремя типами проблем: проблемы корректности, проблемы эффективности и проблемы взаимоблокировки.
проблема правильности
Корректность является ядром программы.Если результат программы может быть неправильным, то значение программы должно быть значительно уменьшено или даже полностью очищено. Мы использовали в предыдущих статьяхsynchronized
Ключевое слово обрабатывает проблемы гонки данных в многопоточном параллелизме. Но в реальном процессе разработки мы столкнемся с более разнообразными проблемами корректности параллелизма. "Невидимые ловушки многопоточности» упоминается в этой статьеsynchronized
ключевые слова,ReentrantLock
Существует ряд инструментов синхронизации потоков, таких как явные блокировки, операции CAS и ключевые слова volatile.Я считаю, что с помощью этих инструментов мы определенно сможем написать большое количество правильных многопоточных программ.
Вопросы эффективности
Хотя мы можем использовать восемнадцать инструментов в наборе инструментов синхронизации потоков для написания правильной многопоточной программы, если она слишком медленная даже для сравнения с однопоточной программой, она не будет стоить выигрыша. Так что мы должны быть не только «правильными», но и «быстрее» в соответствии с предпосылкой «правильно». существует"Руководство по ускорению многопоточности«В этой статье мы можем использовать CAS,ForkJoinPool
, ветка закрыта,java.util.concurrent
Такие технологии, как наборы инструментов, делают наши многопоточные программы в 10, 100 и даже 1000 раз быстрее.
тупиковая проблема
Проблема взаимоблокировки является относительно особой, потому что, как только возникает проблема взаимоблокировки, программа вообще не может продолжать выполняться. Он не дает ошибочных результатов и работает не только слишком медленно, потому что программа полностью останавливается. Проблемы взаимоблокировки встречаются во всех типах параллельных программ, таких как базы данных, операционные системы и т.д. Если это наш персональный компьютер, то его можно перезагрузить после сбоя, но онлайн-сервисы часто работают без перебоев, что требует от нас поиска большего количества и лучших решений для решения проблемы взаимоблокировки в разных ситуациях. Я верю после прочтения этой статьи100 способов решить тупиковые ситуации, у вас будет больше вдохновения для этого вопроса.
Борьба с многопоточным программированием (реализация очереди блокировки)
После обсуждения множества концепций, технологий и приемов, связанных с многопоточностью, пришло время попрактиковаться. Блокирующие очереди являются не только важным инструментом в многопоточном программировании, но также используютМьютексы, переменные условия, оптимизация параллелизмаВ ожидании ряда важных знаний для достижения конкретной реализации, это лучший материал для нашей практической практики. Давайте следоватьРеализуйте собственную очередь блокировки от 0 до 1", вместе от 0 до 1 до N, чтобы завершить полную реализацию очереди блокировки на уровне JDK.
Расширенные темы
Ознакомившись с базовыми знаниями и ключевыми технологиями многопоточности и, наконец, завершив практику, мы можем продолжить углубляться в более эзотерические продвинутые темы в области многопоточности.
Анализ исходного кода модели запуска пула потоков
В предыдущей статье мы освоили использование пула потоков.Хотя пул потоков является компетентным помощником, если мы не понимаем его характер, мы можем бессознательно пересечь некоторые из его основных черт, и, наконец, быть брошенным с трудом. земля. Итак, теперь давайте пройдемПолный анализ исходного кода рабочей модели пула потоков", чтобы проанализировать работающую модель пула потоков и понять, как работает пул потоков с точки зрения исходного кода.
Базовая реализация механизма синхронизации
Мы использовали так много механизмов синхронизации потоков, и эти механизмы синхронизации потоков кажутся такими волшебными и помогают нам избегать одной ловушки за другой. Так как же появились эти удивительные вещи? Пришло время пригласить нашего героя за кулисыAbstractQueuedSynchronizer
(сокращенно AQS).java.util.concurrent
Большинство классов синхронизации потоков в AQS реализованы на основе AQS, например, часто используемый реентерабельный мьютекс.ReentrantLock
, атрезияCountDownLatch
, реентерабельная блокировка чтения-записиReentrantReadWriteLock
, сигналSemaphore
. существует"Базовая реализация механизма синхронизации", мы можем присмотреться и увидеть, как AQS реализует так много разных стилей механизмов синхронизации потоков.
Суммировать
На этом мы завершили путешествие по всей системе знаний о многопоточности Java. В этом процессе мы сначала узнали об основных понятиях параллелизма и основных методах многопоточного программирования на Java, а затем пришли кПул потоковЭта превосходная экономка берет на себя все хлопоты, связанные с выполнением задач и планированием потоков. Затем мы систематически разбираемся и решаем три основные проблемы в многопоточности: проблема корректности, проблема эффективности и проблема взаимоблокировки. Освоив так много знаний и навыков многопоточного программирования на Java, мы проходим большую тренировку, реализуя блокирующую очередь, которая не только может проверить наши навыки многопоточного программирования, но и углубить наше понимание этих знаний. Наконец, мы вошли в глубокую область знаний о многопоточности и изучили три продвинутых темы более низкого уровня с помощью зрелого исходного кода JDK и Netty: модель, управляемая событиями, модель работы пула потоков и базовая реализация механизма синхронизации. .