写点什么

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

评论

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

给我5分钟,保证教会你在vue3中动态加载远程组件

EquatorCoco

Vue 动态加载

构建数据中台,引领零售业数字化转型的最佳实践

数造万象

数据中台 零售 数字化 数据智能 实践案例

打卡智能中国(八):“水花消失术”的AI秘籍

脑极体

AI

Grafana 与观测云:无缝集成的监控可视化体验

可观测技术

数据可视化

AnyMP4 Screen Recorder for Mac v2.2.16激活版 视频捕获与录制工具

iMac小白

在国内怎么运营TikTok?试试云手机!

Ogcloud

云手机 海外云手机 tiktok云手机 云手机海外版 海外云手机推荐

将数据库系统实践转向 AI:使用生成式 AI 创建高效的开发和维护实践

哦豁完蛋了

AI Codec

ai做ppt的工具哪个好?盘点8个好用的AIPPT生成软件!

彭宏豪95

效率工具 职场 PPT 办公软件 AI生成PPT

Java RMI技术详解与案例分析

不在线第一只蜗牛

Java

Prometheus Exporter 在观测云中的应用与优势

可观测技术

#Prometheus

从困境到突破,EasyMR 集群迁移助力大数据底座信创国产化

袋鼠云数栈

集群架构 大数据存储 大数据计算与存储 大数据计算引擎 集群迁移

润开鸿“龙芯+OpenHarmony”开发平台DAYU431先锋派新品发布

坚果

OpenHarmony 润开鸿

官宣|Apache Flink 1.20 发布公告

Apache Flink

flink 实时计算 官宣

云手机:海外社媒运营必备工具

Ogcloud

云手机 海外云手机 云手机海外版 云手机群控 海外社媒运营

天翼云HBlock有奖众测活动 在线邀请存储Geek玩转轻量存储

InfoQ写作社区官方

热门活动 礼品 活动推荐 天翼云

免费一站式搭建企业云上数据库与BI 数据可视化分析平台

XxinQi

最新进展!Intel 18A产品,成功点亮!

E科讯

2024 年 7 月区块链游戏研报:市场波动与数据分化的挑战与机遇

Footprint Analytics

链游

一文全面了解HPC高性能计算平台是什么、怎么选型?高性能计算平台CHPC 都能做什么?

XxinQi

最佳实践:解读GaussDB(DWS) 统计信息自动收集方案

华为云开发者联盟

大数据 GaussDB(DWS) 企业号 8 月 PK 榜 2024企业号8月pk 实时查询

JavaScript 字符串方法,让开发者生活更轻松

伤感汤姆布利柏

言犀智能体平台上线了!赶紧来试试!连接大模型与企业应用的“最后一公里”

京东科技开发者

安全性和合规性:保障企业数据的安全

可观测技术

数据安全 数据合规

解锁亚马逊商品数据:API获取商品列表信息

tbapi

亚马逊API 亚马逊商品数据采集 亚马逊商品列表接口

观测云:零售业数据监控与分析的革新者

可观测技术

监控 零售

观测云:多云架构下的监控革新与效能提升

可观测技术

监控 多云

NFTScan 正式上线 Gravity NFTScan 浏览器和 NFT API 数据服务

NFT Research

NFT NFTScan

腾讯云 ES 之日志分析新范式:10 倍性价比提升!基于 ES Serverless 完成审计日志溯源

腾讯云大数据

ES

继“蓝屏”事件之后,微软再次出现全球性宕机

我再BUG界嘎嘎乱杀

黑客 网络安全 安全 DDoS 网安

腾讯云大数据 TBDS 参编信通院《数据库发展研究报告》,引领数据湖仓创新

腾讯云大数据

TBDS

VideoProc Converter 4K for mac(一站式视频处理软件) v6.5中文版

Mac相关知识分享

Mac软件 视频处理软件

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