Нестандартные расширения модели памяти на практике

Примеры для доклада на SnowOne 2024 и JPoint 2024

Продолжение доклада с JPoint 2023 «Не happens-before единым: нестандартные семантики».

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

Доклад будет интересен всем, кто интересуется многопоточным программированием, моделями памяти и популярными lock-free библиотеками.

Примеры

Номера слайдов Файл Комментарий
6-10 VolatileSF.java Классическая корректная реализация Double-Checked Locking Singleton с помощью volatile
12-14 CompletelyBrokenSF.java Классическая некорректная реализация Double-Checked Locking Singleton без использования volatile
15 PlainSemantic.java Отсуствие гарантии когерентности для plain-семантики. Реальный тест отличается от приведенного на слайде ввиду сложности получения воспроизводимого результата
19 OpaqueSemantic.java Гарантия когерентности для opaque-семантики.
20-22 BrokenSF_WithCoherence.java Все еще некорректный Double-Checked Locking Singleton с исправленной проблемой когерентности. Проблема с причинностью все еще присутствует.
23-32 RelaxedSF.java Исправление Double-Checked Locking Singleton с помощью acquire-release семантики
33-39 RelaxedSF_FinalVersion.java Финальная версия Double-Checked Locking Singleton на ослабленных семантиках
53-67 SPSC_VolatileQueue.java Базовая реализация SPSC-очереди на volatile-семантике
68-82 SPSC_AcqRelQueue.java Базовая реализация SPSC-очереди на acquire-release семантике
83-88 BasicQueueBenchmark.java Бенчмарк базовых реализаций SPSC-очередей
89-107 SPSC_ImprovedQueue.java Улучшенная реализация SPSC-очередей с идеей использования локальных копий индексов
108-110 ImprovedQueueBenchmark.java Бенчмарк улучшенных реализаций SPSC-очередей
108-110 ImprovedQueueBenchmark.java Бенчмарк улучшенных реализаций SPSC-очередей
111 SPSC_DisruptedQueue.java Улучшенная реализация SPSC-очереди с переиспользованием объектов
112-113 DisruptorBenchmark.java Бенчмарк Disruptor (Single Consumer)
114 SPSC_DisruptedQueue_Benchmark.java Бенчмарк улучшенной реализация SPSC-очереди с переиспользованием объектов
116-135 SimpleSeqlockTest.java Seqlock-версия MyObject + тест
136-149 StampedQueueForMyObject.java SPSC-очередь, использующая seqlock
150-151 StampedQueueIdleBenchmark.java Бенчмарк SPSC-очереди, использующей seqlock