【发布时间】:2021-09-27 04:55:36
【问题描述】:
我对 threadLocal 的 initialValue 和 withInital 方法有点困惑。
考虑一种情况,我在父线程中有数据,我正在使用InheritableThreadLocal。
public class Parent extends Thread {
public static ThreadLocal<String> data = new InheritableThreadLocal<String>() {
@Override
protected String initialValue() {
return "temp";
}
};
public static void main(String[] args) {
new Parent().start();
}
public void run() {
data.set("parent data");
System.out.println("Parent Thread Value :" + data.get());
new ChildThread().start();
}
class ChildThread extends Thread {
public void run() {
System.out.println("Child Thread Value :" + Parent.data.get());
}
}
}
输出:
Parent Thread Value : parent data
Child Thread Value : parent data
我在父线程中创建线程,并调用子线程。子线程从父线程继承数据。
现在,如果我像这样初始化变量 data(在第 2 行):
public static ThreadLocal<String> data =InheritableThreadLocal.withInitial(() -> "temp");
我得到以下输出:
Parent Thread Value :parent data
Child Thread Value :temp
我不确定为什么会这样。我阅读了 oracle 的文档,但没有得到有用的东西。 https://docs.oracle.com/javase/8/docs/api/java/lang/ThreadLocal.html#withInitial-java.util.function.Supplier- https://docs.oracle.com/javase/8/docs/api/java/lang/ThreadLocal.html#initialValue--
我想知道如何使用withInitial 而不是使用initialValue 来实现相同的输出?
【问题讨论】:
-
withInitial将返回ThreadLocal,因为它是ThreadLocal上的工厂方法,而不是InheritableThreadLocal上的工厂方法。但是它从InheritableThreadLocal可见,因为它扩展了ThreadLocal。
标签: java multithreading java-8 thread-local inheritable-thread-local