Mycat 和 Java JFRUnit 的核心贡献者,贡献过 OpenJDK,Spring,Spring Cloud,Apache Bookkeeper,Apache RocketMQ,Ribbon,Lettuce、SocketIO、Langchain4j 等项目,CTO 获得徽章 9
统一回复 Java 21 虚拟线程问题:
1. ThreadLocal 继续用么?Java 开发组本来设计虚拟线程的时候,想去掉对于 ThreadLocal 的支持,但是由于使用的库太多,并且很多为了传参才用,并不是缓存,所以就保持了支持。像隐式传参的这种场景,继续用也没事儿,就是性能有所损耗。(不会影响 GC,生命周期随着虚拟线程终止,但是线程本地变量数量变多,哈希表变大,需要频繁清理)。千万别在虚拟线程的 ThreadLocal 放大对象。Java 开发组是想通过 ScopedLocal 替换掉 ThreadLocal(这个没有大哈希的问题),但是在 21 还是 preview。
2. 虚拟线程主要通过 Continuation 实现,虚拟线程栈会在切换的时候复制到 Continuation 中,切换回来的时候,复制回来,但是不是每次都全量复制。在切换回来的时候,线程栈帧懒复制,调用返回到哪个就复制回哪个,这对于像是 servlet 这种很多层调用的是很大的优化,因为栈深度可能有 上百层,但是实际业务只会用到头部几层,这样大大减少了切换的性能消耗。
3. 网络 io 方面,虚拟线程目前完全不会阻塞了。
4. 文件 io 方面,目前实现方式是遇到就增加一个平台线程来规避阻塞。这个会在 io_uring 引入到 JVM 支持后进行优化,到时候文件 io 也原生不会阻塞。
5. JFR,Thread Stack Dump,调试器, JVM TI 都可以兼容虚拟线程。但是要记住,调试虚拟线程可能也会让其他虚拟线程无法执行,因为载波线程是同一个
6. synchronized 以及涉及 ObjectMonitor 的还是会 pin 住载体平台线程,要在你的代码中避免使用。
7. 虚拟线程无法 getAllThreads(),这个方法返回的是所有平台线程
8. 所有 JMX 以及 java.lang.management 相关的都是处理平台线程,不支持 VirtualThread
9. 虚拟线程支持类似于 jstack 的 dump,但是命令有所不同,请通过 jcmd 获取。并且格式是 json,没有死锁信息(虚拟线程 dump 不会进入全局安全点STW所以无法获取一致性信息例如死锁等)
做自媒体技术分享很久了,大家的抬爱与支持让我很开心很感激,但是个人本来做这些也并不是为了收益,只是为了个人学习与传播知识帮助更多的人,所以我将全网所有账号全部收益,持续捐给各种公益项目,也算不辜负大家的抬爱,也是回报祖国对我的一番培养。
太好啦,上了立刻去尝鲜,用个访问量高降级无所谓的微服务试试!
今天看 JLS 突然发现,实际的 implementation(实现) 的输出结果只是 specification(规范) 里面的输出结果的一个 subset(子集)。就是实际的实现,只是对于规范的一个视图,并不是完整的设计思路。所以太抠实际实现的源码的细节可能会导致我们对于整体思路的理解有误。
比如:
线程一执行
x = 1;
r1 = x;
线程 2 执行 x = 2
究竟会在什么情况下会被编译成:
线程1:
x = 1;
r1 = 1;
线程2:
x=2;
不同的虚拟机在不同的场景表现都不一样,但是只要结果(r1 究竟等于什么)是属于结果集的一个子集就可以,规范中说这个是不确定的,我们不必纠结,只是知道这里有并发安全问题知道要同步就可以。实际的实现,会很复杂,JIT 优化,内存优化涉及的会很多,究竟是否因为编译成 r1 = 1 导致其实 r1 只有一个结果不同操作系统不同环境不同JVM实现其实是不确定的。
现在抄袭这么明目张胆????把我文章换个标题,就发出来?????
下一页