JDK25的ScopedValue是什么?为什么可以替代ThreadLocal?
典型回答 **ScopedValue**** 是 Java 25 中引入的一个API(JEP 429)**,它是一种能够在特定作用域内共享不可变数据的新机制,主要用于在线程内和跨线程之间安全、高效地传递数据。 它的核心思想是 “作用域” (Scope)。一个 ScopedValue 的值被绑定到一个动态定义的作用域上。一旦执行流程退出这个作用域,该绑定就会被自动撤销。这个作用域通常由 runWhere(ScopedValue, value, Runnable) 方法来定义。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // 1. 声明一个 ScopedValue(通常为 static final) final static ScopedValue<String> USER_CONTEXT = ScopedValue.newInstance(); // 2. 在某个作用域内“绑定”一个值,并运行代码 ScopedValue.runWhere(USER_CONTEXT, "Hollis", () -> { // 在这个 Lambda(作用域)内,USER_CONTEXT 的值是 "Hollis" methodThatReadsUserContext(); }); // 3. 在作用域内的任何地方读取值 void methodThatReadsUserContext() { String user = USER_CONTEXT.get(); // 获取到 "Hollis" System.out.println("User is: " + user); } // 退出 runWhere 的代码块后,USER_CONTEXT 与 "Hollis" 的绑定自动失效 ScopedValue 被设计用来解决 ThreadLocal 的一些长期存在的问题的,相比 ThreadLocal 他有几个优势: ...