filmov
tv
Project Loom. Асинхронная многопоточность в Java 15
Показать описание
Project Loom: эффективная асинхронная многопоточность в Java 15. Реализация идеи Fibers (файберов) и Continuations (континуаций) - легковесных потоков в Java.
Поддержать проект:
Текущая реализация многопоточности в Java на момент выхода JDK 14 строится вокруг Threads - потоков (тредов) операционной системы. Данный подход не плох сам по себе, но имеет ряд существенных проблем при высокой нагрузке: во-первых экземпляр потока занимает достаточно много оперативной памяти, во-вторых, при большом количестве потоков процессор тратит много времени на переключение между ними, в третьих, при работе с медленными ресурсами (диск, сеть, БД), потоки могут блокироваться и впустую тратить время процессора (во время блокировки потока, процессор ничего не делает).
Для решения этой проблемы в Java вводятся различные сущности и абстракции. Самые яркие из них - ForkJoinPool и CompletableFuture, которые позволяют запускать задачи на выполнение в асинхронной манере без порождения лишних потоков на уровне операционной системы.
Следующий важный шаг - введение Fibers (файберы), Continuations (континуации) и yield (вытеснение). Эти сущности позволяют создавать легковесные потоки сотнями тысяч, без больших затрат оперативной памяти и процессорного времени на переключение контекста потоков на уровне ОС. В любой момент времени задача может вытеснить себя во время выполнения и освободить рабочий тред для другой задачи, повышая утилизацию процессора.
GitHub проекта Loom:
Мейллисты проекта Loom за март 2020:
Статья на хабре, с хорошим описанием того, как происходит вытеснение континуаций в файберах:
Черновики (весьма скудные) документации по проекту:
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
Поддержать проект:
Текущая реализация многопоточности в Java на момент выхода JDK 14 строится вокруг Threads - потоков (тредов) операционной системы. Данный подход не плох сам по себе, но имеет ряд существенных проблем при высокой нагрузке: во-первых экземпляр потока занимает достаточно много оперативной памяти, во-вторых, при большом количестве потоков процессор тратит много времени на переключение между ними, в третьих, при работе с медленными ресурсами (диск, сеть, БД), потоки могут блокироваться и впустую тратить время процессора (во время блокировки потока, процессор ничего не делает).
Для решения этой проблемы в Java вводятся различные сущности и абстракции. Самые яркие из них - ForkJoinPool и CompletableFuture, которые позволяют запускать задачи на выполнение в асинхронной манере без порождения лишних потоков на уровне операционной системы.
Следующий важный шаг - введение Fibers (файберы), Continuations (континуации) и yield (вытеснение). Эти сущности позволяют создавать легковесные потоки сотнями тысяч, без больших затрат оперативной памяти и процессорного времени на переключение контекста потоков на уровне ОС. В любой момент времени задача может вытеснить себя во время выполнения и освободить рабочий тред для другой задачи, повышая утилизацию процессора.
GitHub проекта Loom:
Мейллисты проекта Loom за март 2020:
Статья на хабре, с хорошим описанием того, как происходит вытеснение континуаций в файберах:
Черновики (весьма скудные) документации по проекту:
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
Комментарии