写点什么

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:005943

评论

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

苹果Macos系统 macOS 12 Monterey v12.7.2正式版

Rose

【论文解读】大模型与游戏-综述和路线图

合合技术团队

游戏 LLM

三维数字雕刻ZBrush 2021 mac版下载 含ZBrush 2021破解补丁

Rose

反射API与AOP:实现零配置的服务治理

技术冰糖葫芦

API boy API 文档 API】 API 性能测试

iZotope RX 10 for Mac 专业音频修复 兼容M芯片

Rose

提升IT运维效率:TASKCTL 任务自动化编排工具

敏捷调度TASKCTL

批量任务 TASKCTL 批量异步任务工具 IT自动化运维

用户故事一定要有 “So that...” 吗?

敏捷开发

项目管理 产品经理 敏捷开发 需求分析 用户故事

阿里通义降价,百度文心免费,一图对比谁是最具性价比大模型?

可信AI进展

人工智能 大模型

AI日报|微软推出Copilot+PC,通义主模型大幅降价,文心两大模型全面免费...

可信AI进展

人工智能

接口测试用例设计的关键步骤与技巧

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

测试

零代码零硬件玩转华为云IoT,基于设备联动实时监控设备

华为云开发者联盟

华为云 iotda 华为云IoT 华为云开发者联盟 企业号2024年5月PK榜

【堡垒机小知识】堡垒机和接口机的重要区别分析

行云管家

堡垒机 IT运维 接口机

OpenAI新模型GPT-4o“炸裂登场” 响应速度堪比真人 关键还免费!

蓉蓉

ChatGPT gpt4o

如何提升软件开发从业者在行业中竞争力?

小魏写代码

比较与对比:WMS与TMS在供应链管理中的角色和功能

天津汇柏科技有限公司

仓库管理系统

接口测试用例设计的关键步骤与技巧解析

霍格沃兹测试开发学社

CentOS7.9安装mysql-8.0.36踩坑小记

Simon

MySQL MySQL 运维 MySQL 8.0

鸿蒙4.2和4.0有什么区别?升级后有哪些亮点

FN0

HarmonyOS 鸿蒙系统

【FAQ】HarmonyOS SDK 闭源开放能力 —IAP Kit(2)

HarmonyOS SDK

HarmonyOS

【堡垒机小知识】堡垒机资产监控能监控哪些东西呢?

行云管家

网络安全 堡垒机 主机监控

Web 组态软件 TopStack 快速上手

图扑物联

工业物联网 组态软件 web组态 web组态编辑器

深度解析:接口测试用例设计的关键步骤与技巧

测试人

软件测试 接口测试

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