如何 0 成本启动全员 AI 技能提升?戳> 了解详情
写点什么

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

评论

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

这篇深入浅出贴 助你早日实现Stable diffusion自由

京东科技开发者

迎龙年接新春,来华为手机里寻找祥龙

最新动态

OurBMC大咖说 | OurBMC,共创国产软硬件开源发展新纪元

OurBMC

大咖说 软硬件开源 BMC技术全栈

100%中奖、会员回馈礼…星河会员新春福利到!

飞桨PaddlePaddle

百度 飞桨 飞桨AI 飞桨星河社区

IT工单治理野史:由每周最高150+治理到20+ | 京东物流技术团队

京东科技开发者

【教程】一个比较良心的C++代码混淆器

Kubeadmiral 开源编程挑战 —— 我觉得不错

miraclejzd

字节跳动 Kubernetes 云原生 Kubeadmiral

使用SD-WAN进行企业网络升级的必要性

Ogcloud

SD-WAN SD-WAN组网 SD-WAN服务商

假期想学习,送你测试开发+人工智能大礼包

霍格沃兹测试开发学社

大文件上传原理及实现方案 | 京东物流技术团队

京东科技开发者

淘宝/天猫商品详情API:返回值参数详解及商业逻辑实现

Noah

怎么用ETL工具实现MQ消息同步

谷云科技RestCloud

MQ ETL 数据集成工具

自动化测试,有最佳实践吗?

老张

软件测试 自动化测试

OurBMC 社区 SIG 建设月报(2023 年 10 月)

OurBMC

SIG月报 SIG进展

“祥龙守神州,舞瑞中国年”,京东超市携手王牌驼喜迎新春

科技热闻

OpenSPG新版发布:大模型知识抽取与快速知识图谱构建

百度开发者中心

人工智能 知识图谱 智能客服 大模型

通义灵码——灵动指间,快码加编,你的智能编码助手

阿里巴巴云原生

阿里云 云原生

浅谈LocalCache | 京东云技术团队

京东科技开发者

有了ERP和MES,还需要质量管理QMS系统吗?

万界星空科技

数字化 生产管理系统 mes 万界星空科技 QMS

OurBMC技术委员会2023年四季度例会顺利召开

OurBMC

技术委员会 工作汇报 四季度例会

OurBMC运营委员会2023年下半年度例会顺利召开

OurBMC

运营委员会 工作汇报 首次例会

Gas Hero Coupon NFT 概览与数据分析

Footprint Analytics

区块链 加密货币 NFT

Wireshark中的http协议包分析

小齐写代码

部署Palworld幻兽帕鲁服务器最佳实践(Ubuntu)

天翼云开发者社区

云计算 最佳实践 服务器 云服务器

OurBMC社区首场Meetup成功举办,共建BMC产业生态

OurBMC

Meetup 汇聚智力 共建BMC

测试开发+人工智能大礼包,让你在假期实现弯道超车

测试人

软件测试

玩转OurBMC第一期:社区操作指南-功能篇

OurBMC

玩转OurBMC 操作指南 基本功能

推动海外云手机发展的几个因素

Ogcloud

云手机 海外云手机 云手机海外版 国外云手机

全新 Amazon S3 Express One Zone 高性能存储类服务,震撼发布!

亚马逊云科技 (Amazon Web Services)

Palworld幻兽帕鲁世界参数修改最佳实践(Ubuntu)

天翼云开发者社区

云计算 最佳实践 云服务器

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