发布时间:2022-11-14 文章分类:编程知识 投稿人:李佳 字号: 默认 | | 超大 打印

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos

《支持JDK19虚拟线程的web框架》系列文章链接

本篇概览

关于ThreadLocal

支持JDK19虚拟线程的web框架,之五(终篇):兴风作浪的ThreadLocal

虚拟线程中,ThreadLocal的问题

支持JDK19虚拟线程的web框架,之五(终篇):兴风作浪的ThreadLocal

  1. 虚拟线程中使用ThreadLocal确实会带来内存问题,现在还无解,连虚拟线程自身的工程Loom都在自己代码中删除ThreadLocal的使用,那么我们普通用户敢用吗?还是避而远之吧,在虚拟线程中不要用ThreadLocal
  2. 编号429的JEP,为我们带来了一个解决方案,一种名为Scoped values的变量,可以在一定范围(scope)内被访问,至于这个scope,可以是一个内存范围(例如临时变量就只能在方法内),另外还有一种范围被称为dynamic scope,这个范围就更加灵活了,不过这个JEP当前的状态还很早期,如下图,还在提案阶段,这要是跳票了或者被否了,那我博客不就白写了?就此打住吧,我不能再研究了

支持JDK19虚拟线程的web框架,之五(终篇):兴风作浪的ThreadLocal

  1. 有没有哪个倒霉蛋掉进这个坑里去?

  2. 惨不惨?

  3. 从坑里爬出来没有?

支持JDK19虚拟线程的web框架,之五(终篇):兴风作浪的ThreadLocal

踩坑勇士quarkus

支持JDK19虚拟线程的web框架,之五(终篇):兴风作浪的ThreadLocal

  1. quarkus的人发现:传统线程池模式改用虚拟线程后,性能提升明显,但是反应式框架改用虚拟线程后的提升并不明显,而且还会带来内存消耗过大的问题(看过前面ThreadLocal分析的您,此刻应该猜到原因了了,嘿嘿,您猜的没错)
  2. 如果您的应用对内存有较严要求,quarkus官方建议您继续坚持(stick)使用反应式框架(这话中透露出浓浓的无可奈何,别催了,搞不定...)

Netty的问题

支持JDK19虚拟线程的web框架,之五(终篇):兴风作浪的ThreadLocal

支持JDK19虚拟线程的web框架,之五(终篇):兴风作浪的ThreadLocal

  1. 虚拟线程的特性类似golang的协程,很适合直接拿来处理高并发web请求,为每个请求分配一个虚拟线程,逻辑清晰直白,资源消耗又不高,典型的简单高效
  2. Netty的反应式模型,核心思路就是用少量线程高效分发大量请求,本身就很高效,而且就算优化,线程数也不是瓶颈
  3. 所以,quarkus拎着虚拟线程冲到Netty的地盘一阵操作猛如虎,一看结果...唉,扯远了,来看quarkus官方的解释吧

支持JDK19虚拟线程的web框架,之五(终篇):兴风作浪的ThreadLocal

quarkus强行挽尊

支持JDK19虚拟线程的web框架,之五(终篇):兴风作浪的ThreadLocal

支持JDK19虚拟线程的web框架,之五(终篇):兴风作浪的ThreadLocal

支持JDK19虚拟线程的web框架,之五(终篇):兴风作浪的ThreadLocal

  1. maven的pom.xml添加以下依赖
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-netty-loom-adaptor</artifactId>
</dependency>
  1. 编译构建的时候,增加参数-Dnet.bytebuddy.experimental

  2. 启动的时候,增加参数--add-opens java.base/java.lang=ALL-UNNAMED

小结

欢迎关注博客园:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...