Java 虚拟线程截止 2024-3-10 在 OpenJDK 还没有解决消息的问题

48d5745949f0e628ea102a1b56aa0af5.jpeg

之前的文章《虚拟线程目前不推荐上生产的个人思考》,总结了几个目前的问题:

1. synchronized 的 pin 线程引发的问题比预期严重,或者等到 OpenJDK 修复,或者很多 Java 库要改(尤其是 JDBC 驱动这种)。目前 monitor enter 的 pin 线程问题在 Loom 的预计合入 OpenJDK 23 的分支上有了初步解决方案。

2. 虚拟线程的调度与之前的线程不一样,有些场景需要注意不适用。

3. ThreadLocal很常用很难去掉,ScopedLocal 不能解决所有问题,比如将 ThreadLocal 用作对象池的避免并发访问的场景,这种其实是想针对底层负载线程创建对象。这种一般需要三方库做修改,比如 jackson,jackson 针对这个问题的解决方式是:https://github.com/FasterXML/jackson-core/pull/1064/files#diff-0d3d4113de19d16bfce8a0fffa471b3f90096602b45d598eca91c6b226f7cf2d


一些在 Java 22 的改进:

1. 虚拟线程底层也是通过 epoll 和 kqueue 实现的非阻塞 io,相应地,肯定有 poller 线程。虚拟线程的负载线程,默认是 FoekJoinPool.common 大小也是可用 CPU 数量 - 1,再加上 poller 线程的争用。同时,如果监听事件的线程和实际的处理的线程是同一个也是更好的。所以 Java 22 也会将 poller 线程变为虚拟线程。经过测试,这个修改的提升是比较大的。

c1be01fa14f05b4f03a37c4f48c2529f.jpeg

其实虚拟线程除了这些已知的使用问题,还有明确需要 OpenJDK 解决的问题目前还没有明确的解决方案,但应该是在解决中:

1. 只要涉及本地帧(可以理解为 JVM  C++/C 层面的调用,系统调用等等),如果是本地帧导致的阻塞,大部分都会 pin 线程。

2. 由于 1 的存在,sychronized 的首要问题解决了,但是之后的 wait notify 还是依赖 JVM 层的队列和代码,还是会 pin 线程。

3. 由于 1 的存在,虚拟线程触发类加载,还是会 pin 线程,因为类加载主要代码也是在 JVM 层做的。

4. 文件 io 的阻塞,linux 平台底层通过 io_uring 改写,但是目前整体的改写方案还没定。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/528072.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RN开发搬砖经验之-如何处理FlashList组件加载后调用scrollToIndex没有滚动指定位置

前言 如题,这里只能说是处理,起正向作用的临时方案,因为我也着实没搞懂这个BUG的具体原因,看github上有提相关的issuesFor long lists with different item types scrollToIndex does not work reliable,但看官方没有…

JDBC的学习记录

JDBC就是使用java语言操作关系型数据库的一套API。 JDBC(Java Database Connectivity)是Java语言中用于连接和操作数据库的一种标准接口。它提供了一组方法和类,使Java程序能够与各种不同类型的关系型数据库进行交互。 JDBC的主要功能包括建…

解锁网络数据:入门级IP代理使用教程

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

力扣难题:重排链表

首先通过快慢指针找到中间节点,然后将中间节点之后和之前的部分分为两个链表,然后翻转后面的链表,注意方法,然后将两个链表交替链接。 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode…

通过Forms+Automate+Lists+审批,实现用车申请流程

因为Sham公司目前用的用车申请流程是使用的K2系统,用户申请后,我们还需要单独另行输入Excel来汇总申请记录,当然K2也能导出,但是需要每次导出也是很麻烦的,而且不灵活。 刚好最近发现Forms与Automate能联通&#xff0…

检测虚拟机环境的常见技术

下面列出检测 VMware 虚拟机的常见技术&#xff1a; #include <iostream> #include <windows.h> #include <sysinfoapi.h> #include <comdef.h> #include <Wbemidl.h> #include <ShlObj.h> #include <LM.h> #include <TlHelp32.…

简单BFF架构设计

又到周五了有了一个小时的闲暇时间简单写点东西&#xff0c;介绍一个简单的BFF的架构。BFF:Backends For Frontends,其实现在是个比较常见的前端架构设计的方案&#xff0c;其最大的优势便在于前端可以高度自由的在Node层做一些server端才可以做的东西&#xff0c;比如SSR、登录…

图腾柱PFC工作原理:一张图

视屏链接&#xff1a; PFC工作原理

SpringCloudFeign远程调用

文章目录 1. Feign 是什么2. Feign 的使用2.1 引入依赖2.2 写接口2.3 服务调用方2.4 启动测试 3. Feign 日志配置4. Feign 使用优化5. 注意包扫描问题6. 注意的问题6.1 参数问题6.2 Feign 自动装配 1. Feign 是什么 Feign 是一个声明式、模板化的 HTTP 客户端&#xff0c;它是…

【SQL】185. 部门工资前三高的所有员工(窗口函数dense_rank();区分rank()、row_number())

前述 推荐阅读&#xff1a;通俗易懂的学会&#xff1a;SQL窗口函数 题目描述 leetcode题目 185. 部门工资前三高的所有员工 思路 先按照departmentId分组&#xff0c;再按照salary排序 >窗口函数dense_rank() over() select B.name as Department,A.name as Employee,A…

Web题记

[CISCN 2019华北Day2]Web1 告诉我们想要的东西在flag表和flag字段&#xff0c;那应该是sql注入&#xff0c;先试试 试了一些发现会被检查到&#xff0c;随便传数字 除了1和2有返回结果&#xff0c;其余的都报错&#xff0c;应该是数字型注入&#xff0c;抓包看看过滤了哪些 这个…

Gradle模块化最佳实践

一&#xff0c;模块化的原因及意义 模块化是一种将大型的软件系统拆分成相互独立的模块的方法。具有以下优势&#xff1a; 代码复用&#xff1a;不同的模块可以共享相同的代码。这样可以避免重复编写相同的代码&#xff0c;提高开发效率。模块独立性&#xff1a;每个模块都可…