首页 科技开发工具 娱乐游玩工具 热门工具   APP 登录/注册 联系/合作
   
 
在 JDK 21(预览版)中使用作用域值增强 Java 并发性
Scoped Values现在作为预览功能出现在JDK 21中。与虚拟线程和结构化并发一起,Scoped Values增加了 Java 和Project Loom的增强列表。

可以从任何地方访问作用域值,前提是已创建动态作用域并将所需值绑定到作用域中。想象一个方法调用链,其中包含一个需要使用数据的遥远方法。数据需要沿着调用链向下传递,并注意在到达被调用方之前它可能会被任何方法更改。

Scoped值的行为类似于调用序列中每个方法的附加参数,但没有任何方法实际声明此参数。只有有权访问ScopedValue对象的方法才能检索其值,该值表示正在传递的数据。如 JEP 446 中所述,作用域值(预览)作用域值提高安全性、不变性、封装以及线程内和线程间的高效访问,在多线程环境中使用事务、安全主体和其他形式的共享上下文的应用程序将能够从中受益。但是,它们并不是要取代Java 1.2 中引入的ThreadLocal变量。

两者之间的区别在于可变性和在某些情况下安全性的选择。虽然线程本地允许设置和更改值,但Scoped 值通过控制共享数据采取不同的方法,使其在范围的生命周期内不可变和绑定。

ThreadLocal变量是一个全局变量,通常声明为具有访问器方法的静态字段。这使得变量可变,因为 setter 可以更改值。对于每个新线程,您都可以获得生成线程中已经存在的值,但它可以在新线程中更改,而不会影响生成它的线程中的值。

但是,它也带来了一些挑战,例如ThreadLocal变量是全局可变的。在某些情况下,这可能会导致跟踪和调试挑战,因为线程本地可以在距离创建它的地方很远的地方进行修改(有时称为“远距离幽灵般的行动”,参考爱因斯坦关于量子力学的评论) . 另一个更小的问题是,当它们为每个线程维护副本时,它们会导致更大的内存占用。

另一方面,Scoped Values 引入了一种不同的方式来在应用程序的组件之间共享信息,方法是限制数据的共享方式,确保它是不可变的并且具有清晰和定义明确的生命周期。使用ScopedValue类上的工厂方法newInstance()创建作用域值,并在Runnable、Callable或Supplier调用的上下文中将值赋予作用域值。下面的类说明了一个带有 Runnable 的例子:
在上面的类中,第一行创建了一个名为USER_ID 的作用域值,方法processWithUser(String sessionUserId)通过runWhere()方法调用具有作用域的processRequest()方法,从而执行 run 方法来处理请求。该值在此方法内以及在该方法内调用的任何其他地方有效。作用域值的生命周期是有界的,消除了内存或信息泄漏的风险。

ScopedValue中没有set()方法。这确保该值对于线程是不可变的和只读的。但是,它也允许调用者在被调用者完成处理后需要结果的情况。例如,在callWhere()方法中,返回值操作会将值绑定到当前Thread。在上面的 runWhere 示例方法中,调用了processRequest()方法,但没有返回值。在下面的示例中,从squared()方法返回的值将返回并存储在multiplied变量中。callWhere()使用Callabale<V>,而runWhere()方法需要一个Runnable接口。
Scoped值绑定到当前线程上的值。但是,可以重新绑定以执行新方法。在作用域执行期间不允许重新绑定,但是,一旦作用域执行完成,就可以进行重新绑定。这与 ThreadLocal 不同,在 ThreadLocal 中,绑定可以在执行期间的任何时间通过使用 setter 方法完成。

此外,要从线程中读取作用域值,只需调用get()方法即可。但是,对未绑定范围的值调用get()会抛出NoSuchElementException。如果不确定,请使用ScopedValue.isBound()检查范围值是否绑定。还有两种方法,orElse()和orElseThrow(),分别提供默认值或异常。

线程局部变量和Scoped 值之间的一个重要区别是后者不绑定到特定线程。它们仅为动态范围设置 - 例如发出的方法调用,这意味着单个范围内的值不能在同一线程中具有不同的值。

换句话说,它对数据的“单向传输”很有用。ThreadLocal具有无限制的生命周期,并且在整个生命周期内不控制数据的更改。此外,这是一个昂贵的操作,将值复制到每个子线程。使用作用域值,它被设置一次,然后可以在多个线程上共享,如下例所示,其中 Task 的三个分支共享相同的变量号。
虽然以这种方式在线程之间共享值是有益的,但Scoped 值的缓存大小限制为 16 个条目。要更改默认大小,可以在调用 Java 程序时使用以下参数。
Scoped Values的引入旨在解决与ThreadLocal变量相关的限制,尤其是在虚拟线程的上下文中。尽管并非绝对有必要放弃ThreadLocal,但Scoped Values通过提供一种更高效、更安全的方式在应用程序的组件之间共享敏感信息,显着增强了 Java 编程模型。开发人员可以在JEP-446文档中了解有关Scoped Values的更多详细信息。

我们可能期望随着时间的推移,大量线程局部变量的当前用例将被作用域值取代——但请注意,不幸的是,Java 21 仅将作用域值作为预览功能引入——我们将不得不等待更长的时间才能功能作为最终版本到达。
最新文章:
所有文章资讯、展示的文字、图片、数字、视频、音频、其它素材等内容均来自网络媒体,仅供学习参考。内容的知识产权归属原始著作权人所有。如有侵犯您的版权,请联系我们并提供相应证明,本平台将仔细验证并删除相关内容。
工具综合排行榜
TOP 1
双计算器 双计算器
同时用两个计算器,用于价格对比、数字分别计算等
TOP 2
推算几天后的日期 推算几天后的日期
推算从某天开始,增加或减少几天后的日期
TOP 3
随机密码生成 随机密码生成
随机生成安全复杂的密码,自由设置密码长度及复杂度
TOP 4
推算孩子的血型 推算孩子的血型
根据父母的血型推测子女的血型
TOP 5
日期转中文大写 日期转中文大写
把数字日期转成中文大写,是财务或商务合同常用的工具
热门内容:       双计算器       推算孩子的血型       随机密码生成       日期转中文大写       推算几天后的日期       达轻每日一景       高校分数线       高校查询       周公解梦大全
首页 科技开发工具大全
娱乐游玩工具大全
登录/注册
联系我们
  用户咨询/建议
kf@ss3316.com


商务合作/推广
hz@ss3316.com

达轻工具 APP

访问手机版网站
使用本平台必读并同意:任何内容仅供谨慎参考,不构成建议,不保证正确,平台不承担任何责任,同意用户协议隐私政策   
BaiduTrust安全认证签章
© 达轻科技 版权所有 增值电信业务经营许可证 ICP备 沪B2-20050023-3