子线程可以使用父线程的值,ThreadLocal不可以
无初始值
private static final ThreadLocal<String> TL = new ThreadLocal<>();
private static final InheritableThreadLocal<String> ITL = new InheritableThreadLocal<>();
public static void main(String[] args) throws InterruptedException {
TL.set("tl");
ITL.set("itl");
new Thread(() -> {
System.out.println(TL.get());
System.out.println(ITL.get());
}).start();
}
null
itl
有初始值
private static final ThreadLocal<String> TL = ThreadLocal.withInitial(() -> "tl");
private static final InheritableThreadLocal<String> ITL = new InheritableThreadLocal<String>() {
@Override
protected String initialValue() {
return "itl";
}
};
public static void main(String[] args) throws InterruptedException {
new Thread(() -> {
System.out.println(TL.get());
System.out.println(ITL.get());
}).start();
Thread.sleep(1000);
TL.set("tl2");
ITL.set("itl2");
new Thread(() -> {
System.out.println(TL.get());
System.out.println(ITL.get());
}).start();
}
tl
itl
tl
itl2
当tl中没有值时,返回默认值。
ThreadLocal不复制到子线程,所以没有值