为什么要有虚拟线程(Java项目Loom)?

JEP No 425 是我期待已久的东西。这是 JDK 19 的并发 API 中添加的一个新概念。它处于预览阶段,很快它将在未来的几个版本中成为 JDK 中的永久功能。

虚拟线程非常轻量级,可以减少编写、维护和观察高吞吐量应用程序的工作量。

在这一部分中,我们将认识并理解这个 JEP 的目标。

第一个是使以简单的每个请求线程风格编写的服务器应用程序能够以接近最佳的硬件利用率进行扩展。

让我们了解“每请求每线程”模型。嗯,对于 HTTP 服务器来说,这意味着每个 HTTP 请求都由它自己的线程处理。对于关系数据库服务器来说,这意味着每个SQL事务也由它自己的线程处理。很简单的模型。

One request = one transaction = one thread.

这个模型的成本是多少?好吧,为了理解这个成本,我们需要了解Java中线程的成本。在 Java 的早期版本中创建的 Java 线程是平台线程(也称为操作系统线程)上的简单包装器。

现在,一些数学方面的事情正在进行中。随身携带一个计算器。

关于它们,我们需要了解两件事。首先,平台线程需要将其调用栈存储在内存中。为此,预先在内存中预留了 20MB。其次,它是系统资源。启动平台线程大约需要 1 毫秒。因此,20MB 内存,启动需要 1 毫秒。平台线程实际上是一种相当昂贵的资源。

我们如何利用这些线程来优化硬件利用率?

在这里插入图片描述

假设我们有 16GB 的内存可供应用程序使用。除以一个线程的 20MB,在这样的机器上有 800 个线程 (16 * 1000 / 20) 的空间。假设这些线程正在执行一些 I/O,例如访问网络上的资源。并假设该资源在 100 毫秒内被访问。准备请求和处理响应将分别以 500 纳秒的顺序完成(如上所示)。假设所有这些内存计算需要 1000 纳秒。现在从图中可以看出,由于 1ms = 1000,000 纳秒,这意味着在请求的准备和响应的处理之间存在一个 100,000 量级的因素。在此期间,我们的线程空闲,什么也不做。花费数千美元购买 CPU,使其闲置。真可惜?

因此,如果我们有 800 个这样的线程,我们的 CPU 利用率将为 0.8%。小于1%。如果我们将内存加倍到 32GB,则使用率将达到 1.3%。如果我们想要 90% 的 CPU 使用率,那么我们需要 90,000 个这样的线程。启动它们需要 90 秒,即 1 分半钟,并且将消耗 1.8 TB 内存。如果市场上有这样的内存,我很确定只有少数人买得起。显然,平台线程的成本太高,无法通过接近最佳的硬件利用率进行扩展。 Loom 项目正在解决这个问题。

第二个目标是使基于经典 Java 线程的现有代码能够以最小的更改采用虚拟线程。这个目标也相当雄心勃勃,因为这意味着您可以用经典线程做的所有事情,您应该能够以与虚拟线程相同的方式完成。这涵盖了几个关键点:

首先,虚拟线程可以运行任何Java代码或任何本机代码。

其次,你不需要学习任何新概念。

第三,但你需要忘掉某些想法。虚拟线程很便宜,比传统平台线程便宜大约 1000 倍,因此试图避免阻塞虚拟线程是没有用的。编写经典的阻塞代码是可以的。这是一个好消息,因为阻塞代码比异步代码更容易编写。

池化虚拟线程是个好主意吗?答案是一个很大的禁忌,因为它很便宜,不需要将它们集中起来,只需要按需创建和销毁。

关于虚拟线程的另外两个好消息首先,线程局部变量也以同样的方式工作。其次,同步也有效。关于同步,现在需要说几件事。虚拟线程仍然运行在平台线程之上。下面还有一个平台线。诀窍是,这个虚拟线程可以与其平台线程分离,以便该平台线程可以运行另一个虚拟线程。什么时候才能脱离(平台线程)呢?好吧,虚拟线程一旦阻塞就可以与其平台线程分离。它可能会在 I/O 操作、同步操作或进入睡眠状态时被阻止。

需要注意的是,如果虚拟线程正在同步块内执行某些代码,则它无法与其平台线程分离。因此,在运行同步代码块期间,它会阻塞平台线程。如果这个时间很短也没关系,不必惊慌。如果这个时间很长,也就是说,如果它正在做一些长时间的I/O操作,那么情况就不太妙了,我们可能需要做点什么。我们需要用可重入锁 API 替换同步块。同步块的这个问题将来可能会得到解决,事实上,当虚拟线程成为 JDK 的最终功能时,它可能会得到解决。

市面上也有响应式编程,也在尝试解决这个问题。但反应式的问题在于,它是我们编码方式的彻底范式转变。它很难学习,很难理解,很难分析代码,更难以调试,并且编写测试用例是一场噩梦。

希望您已经了解 Loom 项目试图解决的问题。在接下来的部分中,我们将研究一些编码。我对这个项目感到很兴奋。

原文地址

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

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

相关文章

Spring——Spring整合MyBatis

Spring整合MyBatis 1.创建工程 1.1.pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"…

HarmonyOS 编写副标题 解决 ubTitle 可能淘汰问题

目前 harmonyos 中 title属性目前用的还正常 但是ubTitle副标题 会提示我们 可能要淘汰了 虽然说 我们目前 强行用 还是可以生效 但可能 哪天版本更新移除了这个属性 代码就报错了 我们可以通过Builder 来写这个副标题 和 标题 Entry Component struct Index {build() {Row(…

海外社媒运营为什么需要选择优质IP代理?

跨境电商卖家尤其需要关注海外社媒运营&#xff0c;想要更好地运营Instagram、Facebook、TikTok 或 Twitter等&#xff0c;挖掘社媒潜力需要采取战略方法&#xff0c;而社交媒体IP代理在这一活动中发挥着至关重要的作用&#xff0c;下面为你详细介绍。 一、社交媒体代理IP及其运…

【SkyWant.[2304]】路由器操作系统,移动【Netkeeper】使用教程校园网

目录 步骤一&#xff1a;正确连接网线&#xff0c;插电开机正确连接网线&#xff1a; 认识系统灯&#xff1a; 插电开机&#xff1a; 步骤二&#xff1a;开机之后&#xff0c;系统的基本设置 1.进入设置界面&#xff1a; 2.设置辅助热点wifi&#xff1a; 3.设置日常…

ROS2 Humble学习笔记

本文发表与个人的github pages。部分内容未同步到这里。 想查看完整内容&#xff0c;请移步到ROS2 Humble学习笔记。 一、前言 2013年的时候已经接触ROS了&#xff0c;当时断断续续学习了一些ROS的基础知识。16年搬到深圳之后&#xff0c;也有幸参加过星火的一次关于ROS的一些…

变电站综合自动化监控系统在某物流园35kV变电站中应用

摘 要&#xff1a;Acrel-1000变电站综合自动化系统&#xff0c;是我司根据电力系统自动化及无人值守的要求&#xff0c;总结国内外的研究和生产的先进经验&#xff0c;专门研制出的新一代电力监控系统。本系统具有保护、遥测、遥信、遥脉、遥调、遥控功能&#xff0c;可实现无人…

如何通过绘制【学习曲线】来判断模型是否【过拟合】

学习曲线是一种图形化工具&#xff0c;用于展示模型在训练集和验证集&#xff08;或测试集&#xff09;上的性能随着训练样本数量的增加而如何变化。它可以帮助我们理解模型是否受益于更多的训练数据&#xff0c;以及模型是否可能存在过拟合或欠拟合问题。学习曲线的x轴通常是训…

数据结构之B树和B+树

数据结构可视化演示链接&#xff0c;也就是视频中的网址 文章目录 一、B-Tree二、BTree(B-Tree变种) 一、B-Tree 样例图 叶节点具有相同的深度&#xff0c;叶节点的指针为空所有索引元素不重复节点中的数据索引从左到右递增排列 二、BTree(B-Tree变种) 样例图 非叶子节…

ThreadLocal内存泄漏与解决

目录 什么是Threadlocal&#xff1f; Threadlocal的基本使用 ThreadLocal的内存泄漏举例 场景1 场景2 场景3 场景4 内存泄漏原因分析 总结 什么是Threadlocal&#xff1f; ThreadLocal 是 Java 中的一个类&#xff0c;它提供了线程本地变量的支持。线程本地变量是指被…

Win10子系统Ubuntu实战(一)

在 Windows 10 中安装 Ubuntu 子系统&#xff08;Windows Subsystem for Linux&#xff0c;简称 WSL&#xff09;有几个主要的用途和好处&#xff1a;Linux 环境的支持、跨平台开发、命令行工具、测试和验证、教育用途。总体而言&#xff0c;WSL 提供了一种将 Windows 和 Linux…

Python库中关于时间的常见操作

目录 导入所需的库 获取当前时间 格式化日期和时间 解析日期和时间字符串 时间戳操作 获取当前时间戳&#xff1a; 将时间戳转换为日期和时间&#xff1a; 时间差操作 时间日期的时区处理 时间日期的随机生成 注意事项 总结 在Python中&#xff0c;时间处理是一个重…

Low Poly Cartoon House Interiors

400个独特的低多边形预制件的集合,可以轻松创建高质量的室内场景。所有模型都已准备好放入场景中,并使用一个纹理创建,以提高性能!包含演示场景! 模型分类: - 墙壁(79件) - 地板(28块) - 浴室(33个) - 厨房(36件) - 厨房道具(68件) - 房间道具(85件) - 灯具(…

《亚太教育》是什么级别的期刊?是正规期刊吗?能评职称吗?

《亚太教育》主要发表教育理论研究、教育教学实践、学校管理、学科教育、科研管理等学术论文以及其他与教育教学相关的学术论文和研究成果,现征集教育管理以及各学科优秀论文。欢迎.各位教师、教育工作者及高校学生踊跃投稿。 收录情况&#xff1a;知网万方维普收录 投稿方式&a…

vscode使用npm安装element-UI并添加router路由

npm安装vue&#xff0c;添加淘宝镜像-CSDN博客 elementUI安装与配置 安装可以看我上一篇文章 vscode控制台输入指令 npm i element-ui -S 安装完成后在目录结构打开下图文件 可以看到多了一行elementui就代表安装成功了 下面是项目常用的结构 安装完成后需要启用elementU…

Java项目:114SSM图书管理系统

博主主页&#xff1a;Java旅途 简介&#xff1a;分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 图书管理系统基于SpringSpringMVCMybatis开发&#xff0c;系统主要实现了图书馆借书还书功能&#xff0c;系统分为管理员和读者两种角色。 管理员功能如下…

20240105移远的4G模块EC20在Ubuntu 20.04.6 LTS下使用联通5G卡上网的步骤

20240105移远的4G模块EC20在Ubuntu 20.04.6 LTS下使用联通5G卡上网的步骤 2024/1/5 10:11 缘起&#xff1a;需要在Firefly的AIO-3399J开发板上调试移远的4G模块EC20&#xff08;Android10/11/12&#xff09;&#xff0c;需要现在先测试EC20的好坏&#xff01; 陶老板告诉我找一…

多链混沌:Layer2 格局演变与跨链流动性的新探索

点击查看原文&#xff1a;多链混沌&#xff1a;Layer2 格局演变与跨链流动性的新探索 如今的 Crypto 是一个由多链构成的混沌世界。曾经&#xff0c;以太坊聚集了加密世界绝大多数的流动性与 DeFi 应用&#xff0c;但现在其 TVL 占比已经降到 60% 以下&#xff0c;并仍处于下降…

【51单片机系列】串口通信模块

文章目录 一、计算机串行通信基础二、串行通信的基本概念2.1、异步通信与同步通信2.2、串行通信的传输方向2.3、串行通信常见的错误校验2.4、传输速率 三、串行通信接口标准3.1、RS-232C接口3.2、RS-422A3.3、RS-485接口 四、80C51的串行口4.1、80C51串行口的控制寄存器4.2、80…

Python解析参数的三种方法

今天我们分享的主要目的就是通过在 Python 中使用命令行和配置文件来提高代码的效率 Let’s go! 我们以机器学习当中的调参过程来进行实践&#xff0c;有三种方式可供选择。第一个选项是使用 argparse&#xff0c;它是一个流行的 Python 模块&#xff0c;专门用于命令行解析&…

Spring boot 3 集成rocketmq-spring-boot-starter解决版本不一致问题

安装RocketMQ根据上篇文章使用Docker安装RocketMQ并启动之后&#xff0c;有个隐患详情见下文 Spring Boot集成 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2…