写点什么

JEP 481:作用域值 API 的第 3 个预览版随 JDK 23 发布,带来关键增强

  • 2024-08-12
    北京
  • 本文字数:1628 字

    阅读完需:约 5 分钟

JEP 481:作用域值API的第3个预览版随JDK 23发布,带来关键增强

JEP 481(作用域值第 3 个预览版)——之前称为范围局部变量(孵化)——提供了第三次预览。该版本只有一个变化,旨在从之前的一轮孵化和两轮预览之外获得额外的经验和反馈:随 JDK 22 交付的 JEP 464(作用域值第 2 个预览版)、随 JDK 21 交付的 JEP 446(作用域值预览版)以及随 JDK 20 交付的 JEP 429(作用域值孵化)。该特性支持在线程内部和线程之间共享不可变数据。


在 JDK 23 中重新预览的作用域值 API 修改了ScopedValue.callWhere方法。现在,这个方法的操作参数是一个函数式接口。它允许 Java 编译器推断是否可能抛出检查异常。因此,ScopedValue.getWhere这个方法就不再需要了,而且已经删除。在频繁共享数据的场景中,这会使代码更简洁,而且性能更好。


作用域值使方法能够与其调用者和子线程共享不可变数据。与线程局部变量相比,这可以简化数据流的管理和推断。而且,它们的空间和时间成本更低,特别是在与虚拟线程(JEP 444)和结构化并发(JEP 480)结合使用时。


不过,Java 1.2 中引入的线程局部变量一直是一个简化同一线程内方法间数据共享的传统方法。尽管已经使用了很长时间,但它还是有一些缺点。一个主要的问题是它们毫无约束的可变性,任何代码都可以随时更改线程局部变量的值,这可能导致潜在的不一致。另一个缺点是它们的寿命不受限制;如果开发人员忘记调用remove方法,值的保存时长可能会超过所需的时长,而这通常会导致内存泄漏。此外,跨线程继承线程局部变量会显著增加开销,因为每个子线程都必须为先前在父线程中写入的每个线程局部变量分配存储空间,这会对性能产生负面影响。


作用域值解决了这个问题,它确保数据是不可变的,并且只能在定义好的作用域中访问。这增强了安全性和性能。


为了说明作用域值的好处,考虑下这样一个 Web 框架,它的上下文需要在不同的方法之间共享,而又不需要显式地将其作为参数传递。使用线程局部变量,该框架可能是这样的:


class Framework {
private final static ThreadLocal<FrameworkContext> CONTEXT = new ThreadLocal<>();
void serve(Request request, Response response) { var context = createContext(request); CONTEXT.set(context); Application.handle(request, response); }
public PersistedObject readKey(String key) { var context = CONTEXT.get(); var db = getDBConnection(context); return db.readKey(key); }}
复制代码


使用作用域值,其实现会变得更加简洁、高效:


class Framework {
private final static ScopedValue<FrameworkContext> CONTEXT = ScopedValue.newInstance();
void serve(Request request, Response response) { var context = createContext(request); ScopedValue.runWhere(CONTEXT, context, () -> Application.handle(request, response)); }
public PersistedObject readKey(String key) { var context = CONTEXT.get(); var db = getDBConnection(context); return db.readKey(key); }}
复制代码


使用线程局部变量,当框架调用用户代码以及当用户代码回调框架方法时,不需要将FrameworkContext作为方法的参数进行传递。线程局部变量是作为一个隐藏的方法参数:线程调用Framework.serve中的CONTEXT.set。然后,Framework.readKey中的CONTEXT.get自动就可以看到CONTEXT的本地副本。实际上,ThreadLocal字段充当了一个键,用于查找当前线程的FrameworkContext值。另一方面,使用作用域值简化了这个过程。它消除了可变状态,并且确保上下文只能在runWhere方法定义好的范围内访问,从而提供了一种更健壮且性能更好的方法。总之,作用域值 API 显著增强了 Java 中跨方法和线程共享数据的方式,促进了更好的编码实践,并提高了应用程序的性能。它非常符合现代并发模型,特别是当虚拟线程出现之后,它为开发人员处理高并发应用程序提供了一个重要的选项。


原文链接:

https://www.infoq.com/news/2024/07/jep-481-enhanced-scoped-values/

2024-08-12 08:005988

评论

发布
暂无评论
发现更多内容

Java干货分享

codemonkey

#java #并发

技术文档 | 使用 Spring AI 实现一个简单的 Pulsar MCP Server

AscentStream

MCP

Rust 性能提升“最后一公里”:详解 Profiling 瓶颈定位与优化|得物技术

得物技术

rust Profile rust语言

私有化部署局域网 IM:BeeWorks支持内网使用

BeeWorks

即时通讯 IM 私有化部署

黑龙江等保测评全流程解析:从定级到整改的完整指南

等保测评

英伟达被约谈?国产替代迎来新机遇

禅道项目管理

软件开发 信创 软件安全 国产化替代 禅道项目管理软件

哈尔滨等保测评中的 “神秘角色”:测评师

等保测评

超融合架构 “破壁”:从企业到数据中心的全能应用版图

智驱前线

7 月 SeaTunnel 社区狂飙:新特性、强优化、贡献者满分输出

白鲸开源

开源 数据同步 数据集成 Apache SeaTunnel

VS Code Server本地Docker部署+贝锐花生壳内网穿透远程访问教程

科技热闻

MyEMS:重塑能源管理,驱动高效节能新变革

开源能源管理系统

开源 能源管理系统

大数据-65 Kafka 高级特性 Broker ISR 宕机重平衡 实测详解

武子康

Java 大数据 kafka 分布式 消息队列

Prometheus 告警时为何无法获取现场值

巴辉特

Prometheus 监控告警 夜莺监控 运维监控 开源监控

非凸科技受邀参加Community Over Code Asia 2025 Rust分论坛

非凸科技

CAD中如何绘制圆弧?详细教程来了

在路上

cad cad看图 CAD看图王

企业 IM 即时通讯BeeWorks

BeeWorks

即时通讯 IM 私有化部署

告别研发痛点!群核科技靠 “自动化左移” 重构质量效能,效能飙升有何秘诀?

杭州群核科技质量效能

昆仑万维「Matrix-Game 2.0」发布,国产开源的Genie 3来啦!

新消费日报

通过Milvus内置Sparse-BM25算法进行全文检索并将混合检索应用于RAG系统

阿里云大数据AI技术

全文检索 Milvus 混合检索 RAG应用 Sparse-BM25算法

京东店铺所有商品API技术指南

tbapi

京东API 京东数据接口 京东店铺所有商品接口 京东店铺数据采集

全前维护LED显示屏优势和选购指南

Dylan

LED显示屏 全彩LED显示屏 户外LED显示屏 led显示屏厂家 户内led显示屏

主流自动化测试框架的技术解析与实战指南

测吧(北京)科技有限公司

人工智能 智能体 测试开发 playwright selenium

超越预算,打开企业预算管理新思维

智达方通

全面预算管理 财务管理 成本预算管理

一文吃透 Promise 与 async/await,异步编程也能如此简单!建议收藏!

左诗右码

Apache SeaTunnel 新定位!迈向多模态数据集成的统一工具

白鲸开源

大数据 开源 数据集成 多模态 Apache SeaTunnel

开源能源管理系统应用前景:以 MyEMS 为例

开源能源管理系统

开源 能源管理系统

黑龙江等保测评核心指标解析:技术安全与管理安全的双重保障

等保测评

跨文化冲突下的品牌舆情管理

沃观Wovision

出海企业 舆情监控 沃观Wovision 海外舆情监测

一文教你Docker自建Jupyter Notebook,并用内网穿透实现远程访问

科技热闻

CST帮助文档:SIMULIA网格处理软件---PowerDELTA

思茂信息

cst cst电磁仿真 CST Studio Suite

ClkLog埋点与用户行为分析系统2.0:架构升级性能跃迁,限时优惠速来体验

ClkLog

开源 用户行为分析 CDP 客户画像 埋点分析系统

JEP 481:作用域值API的第3个预览版随JDK 23发布,带来关键增强_编程语言_A N M Bazlur Rahman_InfoQ精选文章