Примеры для доклада на JPoint 2023
Несмотря на то, что новые режимы упорядочивания доступов к памяти стали доступны еще с выходом JDK 9, немногие разработчики знакомы с ними. Хотя эти семантики все еще не имеют формального описания в модели памяти Java, они широко используются в популярных многопоточных библиотеках: JCTools, Disruptor, Agrona, Aeron и многих других. Поэтому для изучения исходного кода этих проектов нужно понимать существующие режимы упорядочивания.
Но даже для исключительно прикладных разработчиков-пользователей этих библиотек понимание свойств этих режимов позволяет осознанно подходить к выбору используемой реализации многопоточных структур данных. Все это может увеличить производительность всей системы.
В докладе последовательно рассматриваются все доступные на данный момент режимы: plain, opaque, acquire-release, volatile. Для каждого показаны его высокоуровневые свойства и примеры использования.
Доклад будет интересен всем, кто интересуется многопоточным программированием, моделями памяти и популярными lock-free библиотеками.
См. на странице доклада
Номера слайдов | Файл | Комментарий |
---|---|---|
19-26, 134-137 |
VolatileSemantic_HappensBefore.java |
Упорядочивание операций чтения/записи через happens-before |
53-64 | PlainSemantic.java |
Некорректное использование plain-семантики, бесконечный цикл |
74-94 | VarHandleApi.java |
Использование VarHandle в своём коде |
101-107 | OpaqueSemantic_Progress.java |
Демонстрация гарантии прогресса для opaque-семантики |
110-120 | OpaqueSemantic_Coherence.java |
Переупорядочивание операций над независимыми переменными при использовании opaque-семантики |
125-129 | OpaqueSemantic_BitwiseAtomicity.java |
Гарантия атомарности операций чтения/записи в opaque-семантике |
138-152 | AcquireReleaseSemantic_Causality.java |
Упорядочивание операций чтения/записи через гарантию причинности с помощью acquire-release семантики |
161-172 | SPSC_BoundedQueue.java SPSC_VolatileQueue.java SPSC_AcqRelQueue.java |
Простейшая очередь фиксированного размера для строго одного производителя и строго одного потребителя: SPSC_BoundedQueue . Две реализации этой очереди, через volatile-семантику: SPSC_VolatileQueue , и через acquire-release-семантику: SPSC_AcqRelQueue |
173-176 | QueueBenchmark.java |
Бенчмарк, измеряющий пропускную способность реализованных SPSC-очередей |
180-187 | VolatileSemantic_Consensus.java |
Соревнование 🦊красной панды и 🐱кота: использование гарантии консенсуса с помощью volatile-семантики |
189-197 | AcquireReleaseSemantic_NoConsensus.java |
Потенциальный конфликт в итогах соревнования при использовании acquire-release семантики. К сожалению, на доступном мне оборудовании конфликт не воспроизводится, но скорее всего случится на архитектуре PowerPC |
199 | AcquireReleaseSemantic_NoConsensus_Dekker.java VolatileSemantic_Consensus_Dekker.java |
Видоизмененный пример, теперь логика Referee#1 находится в потоке 🐱Cat , логика Referee#2 находится в потоке 🦊Red Panda ; в результате чего возможен конфликт для acquire-release семантики; для volatile-семантики конфликт ввиду гарантии консенсуса не возможен |
Barriers_NoConsensus_Dekker.java |
Контрпример для лекции Магистерский курс C++ (МФТИ, 2022-2023). Лекция 21. Атомики, часть 3, слайд 107: "Явные барьеры спешат на помощь" - недостаточность семантик opaque и acquire-release для реализации алгоритма Деккера | |
Single_Variable_Coherence.java |
Контрпример для лекции Магистерский курс C++ (МФТИ, 2022-2023). Лекция 21. Атомики, часть 3, слайд 116: "Теория относительности", невозможность проявления эффектов относительности для строго одной переменной ввиду наличия гарантии когерентности для семантик от opaque и сильнее |
Для запуска примеров использовалось следующее оборудование:
CPU: Intel Core i9 12900K (энергоэффективные ядра отключены)
RAM: 32GB DDR5-4800 MHz
JVM: 17.0.6+10-LTS
OS: Ubuntu 22.04.2 LTS/Linux 5.15.0-69-generic
CPU: Broadcom BCM2711
RAM: 8GB LPDDR4-1500 MHz
JVM: 17.0.6+10-LTS
OS: Ubuntu 22.04.2 LTS/Linux 5.15.0-1026-raspi/arm64
CPU: Broadcom BCM2836
RAM: 1GB LPDDR2-400 MHz
JVM: 17.0.6+10-LTS
OS: Raspbian GNU/Linux 5.15.84-v7+/arm