<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Java 25 on 隔叶黄莺 Yanbin's Blog - 软件编程实践</title><link>https://yanbin.blog/tags/java-25/</link><description>Recent content in Java 25 on 隔叶黄莺 Yanbin's Blog - 软件编程实践</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><managingEditor>yabqiu@gmail.com (Yanbin Qiu)</managingEditor><webMaster>yabqiu@gmail.com (Yanbin Qiu)</webMaster><copyright>Yanbin 隔叶黄莺</copyright><lastBuildDate>Fri, 24 Apr 2026 23:34:00 -0500</lastBuildDate><atom:link href="https://yanbin.blog/tags/java-25/index.xml" rel="self" type="application/rss+xml"/><item><title>Java 25 新特性学习 - Scoped Values</title><link>https://yanbin.blog/java-25-new-features-scoped-values/</link><pubDate>Fri, 24 Apr 2026 23:34:00 -0500</pubDate><author>yabqiu@gmail.com (Yanbin Qiu)</author><guid>https://yanbin.blog/java-25-new-features-scoped-values/</guid><description>
&lt;p&gt;Java 25 是一个 LTS 版本，它的众多新特性中就数 &lt;a href="https://openjdk.org/jeps/506"&gt;&lt;code&gt;JEP 506: Scoped Values&lt;/code&gt;&lt;/a&gt; 能改变我们从前使用
&lt;code&gt;ThreadLocal&lt;/code&gt; 时的编程范式。因其重要性，所以单列一篇来专门学习它。&lt;code&gt;Scoped Values&lt;/code&gt;, 可用来替代 &lt;code&gt;ThreadLocal&lt;/code&gt; 的使用，特别是在虚拟线程当中。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Scoped Values&lt;/code&gt; 用于在当前线程或子线程中共享不可变的数据，说到不可变的数据就会想到 &lt;code&gt;JEP 502: Stable Values (Preview)&lt;/code&gt;.
&lt;code&gt;ThreadLocal&lt;/code&gt;， 甚至 &lt;code&gt;InheritableThreadLocal&lt;/code&gt; 用于子线程中共享数据还是有些挑战性，特别碰到线程池的情况, 而且 &lt;code&gt;ThreadLocal&lt;/code&gt;
不在乎数据可变还是不可变的，执行当中谁改了数据，不知道。&lt;code&gt;Scoped Values&lt;/code&gt; 的 JEP 说其目的不是用来完全替代 &lt;code&gt;ThreadLocal&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;下面来看看 &lt;code&gt;Scoped Values&lt;/code&gt; 如何在子线程中共享数据，它还能与虚拟线程的结构化并发配合使用。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ThreadLocal&lt;/code&gt;/&lt;code&gt;InteritableThreadLocal&lt;/code&gt; 仍然是很多框架用来在线程中(间)共享数据的办法，在 &lt;code&gt;Spring&lt;/code&gt; 框架中有大量的使用， 如
&lt;code&gt;XxxContextHolder&lt;/code&gt; 之类的。目前的 &lt;code&gt;ThreadLocal&lt;/code&gt; 存在一些问题&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ThreadLocal 中的数据是可变的，多数应用场景只要不可变的数据&lt;/li&gt;
&lt;li&gt;难以管理共享数据的生命周期，特别是在线程池中，线程被重用时，ThreadLocal 中的数据可能会被意外共享或泄露。由使用方主动清除数据，更是会造成潜在的 Bug&lt;/li&gt;
&lt;li&gt;成本高昂，创建子线程，或线程切换时要对共享数据进行复制，&lt;code&gt;VirtualThread&lt;/code&gt; 也是继承自 &lt;code&gt;Thread&lt;/code&gt;, 所以虚拟线程也能用 &lt;code&gt;ThreadLocal&lt;/code&gt;。
一旦虚拟线程的数量达到成千上万，十百万的级别时，&lt;code&gt;ThreadLocal&lt;/code&gt; 数据不停复制的代价就很高了&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>