история
В 1995 году компания Sun выпустила первую версию языка java.Можно сказать, что использование java от jdk1.1 до jdk1.4 было в основном в мобильных приложениях и приложениях для малых и средних предприятий.В таких областях в основном нет необходимости разрабатывать крупномасштабные параллельные сценарии, и, конечно же, ни одна крупная интернет-компания не использует java из-за опасений по поводу ее собственной производительности.
С быстрым развитием Интернета и серверного оборудования компания Sun уделяет больше внимания приложениям корпоративного уровня.Нет сомнений в том, что высокий параллелизм является важной темой, поэтому она добавила более мощную версию в J2SE5.0 (jdk1.5). ) под кодовым названием Tiger.Операционный пакет, связанный с параллелизмом — java.util.concurrent.
С тех пор java хорошо зарекомендовал себя в условиях высокого параллелизма.Многие крупные интернет-компании используют java в качестве основного языка разработки, например, Alibaba, eBay и т. д. Доступ к системам этих компаний, безусловно, представляет собой крупномасштабный параллельный сценарий мирового уровня. , что отражает использование Java в крупномасштабных параллельных сценариях. Это работает.
Платформа AQS
Параллельный пакет Jdk предоставляет различные механизмы блокировки и синхронизации. Основным классом его реализации является AbstractQueuedSynchronizer, который мы для краткости называем инфраструктурой AQS. Он обеспечивает базовую структуру для реализации механизмов блокировки и синхронизации для различных сценариев и представляет собой атомарное управление состояние синхронизации, блокировка потока, разблокировка потока и управление очередями обеспечивают общий механизм.
Автором параллельного пакета Jdk (juc) является Дуг Ли, но идея состоит в том, чтобы объединить мудрость многих мастеров.Если вы хотите глубже понять теорию juc, вы можете обратиться к Дугу Ли "The_java.util.concurrent_Synchronizer_Framework" бумага. Отсюда вы можете найти теоретическую основу AQS, включая основные принципы, требования, дизайн, идеи реализации, использование и производительность платформы.Из-за большого объема этих аспектов в этой статье не ставится цель охватить все аспекты, но в основном фокусируется на структуре класса AQS и связанных с ним операциях.
очередь AQS
AQS инкапсулирует поток в узел и поддерживает очередь FIFO узла CHL, которая является неблокирующей очередью FIFO, то есть вставка или удаление операций в эту очередь в параллельных условиях не будет блокироваться, это осуществляется с помощью спин-блокировок и CAS. обеспечить атомарность вставки и удаления узла и добиться быстрой вставки без блокировки.
Фактически, AbstractQueuedSynchronizer в основном поддерживает атрибут состояния, очередь FIFO и операции блокировки и разблокировки потока. state представляет собой состояние синхронизации, его тип — 32-битное целое число, а обновление состояния должно обеспечивать атомарность. Очередь здесь представляет собой двусвязный список, и у каждого узла есть prev и next, которые являются ссылками на предыдущий узел и следующий узел соответственно. Следует отметить, что каждый узел в этом двусвязном списке, кроме заголовка цепочки, содержит поток, а заголовок цепочки можно понимать как пустой узел.
структура очереди
Нам нужно понять структуру очереди в глубину.На следующем рисунке показана структура одного из узлов двусвязного списка.Узел содержит пять основных элементов, что означает следующую таблицу:
- Предыдущий узел: предшествующий узел, указывающий на предыдущий узел
- Node next: следующий узел, указывающий на следующий узел
- Узел nextWaiter: следующий узел, используемый для хранения очереди условий.
- Поток потока: текущий поток при входе в очередь
- int waitStatus: существует пять состояний:
- SIGNAL, значение равно -1, что указывает на то, что потоки в последующих узлах текущего узла заблокированы посредством парковки, а текущий узел необходимо разблокировать посредством отмены парковки при его освобождении или отмене.
- ОТМЕНА со значением 1 указывает, что поток текущего узла был отменен из-за тайм-аута или прерывания.
- УСЛОВИЕ, значение равно -2, что указывает на то, что текущий узел находится в очереди условий.
- PROPAGATE, значение равно -3, головной узел общего режима может находиться в этом состоянии, что указывает на безусловное нисходящее распространение Это состояние вводится для оптимизации конкуренции блокировок, чтобы потоки в очереди просыпались один за другим в упорядоченном порядке способ.
- 0, за исключением пятого состояния из четырех вышеперечисленных состояний, которое обычно является начальным состоянием узла.
Введение предшествующего узла prev в основном предназначено для завершения семантики тайм-аута и отмены.После отмены предшествующего узла необходимо только найти неотмененный предшествующий узел, введение последующего узла в основном для оптимизации поиска последующего узел, чтобы избежать каждый раз из хвоста.Смотрите вперед, nextWaiter используется для представления последующих узлов очереди условий.В это время атрибуты prev и next больше не будут использоваться, а состояние узла - Node.CONDITION; waitStatus представляет состояние последующего узла, поскольку AQS использует реализацию очереди CLH.Управление структурой потока и структура CLH заключается в использовании определенного атрибута предыдущего узла для представления состояния текущего узла, что упрощает реализацию функции отмены и тайм-аута.
Суммировать
Вышеприведенное представляет собой введение в структуру узлов и узлов, образующих очередь.Учетная запись ниже представляет некоторые операции, связанные с AQS, включая получение и освобождение блокировки, управление очередью, обновление состояния синхронизации, блокировку и пробуждение потока, отмену прерывания и тайм-аут. прерывание и т.п.
------------- Рекомендуем прочитать ------------
Зачем писать «Анализ проектирования ядра Tomcat»
Резюме моей статьи за 2017 год — машинное обучение
Краткое изложение моих статей за 2017 год — Java и промежуточное ПО
Резюме моих статей 2017 года — глубокое обучение
Краткое изложение моих статей за 2017 год — исходный код JDK
Резюме моей статьи за 2017 год — обработка естественного языка
Резюме моих статей 2017 года — Java Concurrency
Поговори со мной, задай мне вопросы:
Добро пожаловать, чтобы следовать: