问题描述
真实环境中遇到,通过ThreadLocal记录线程中的key,启动项目之后第一次触发居然get不到值,后面再次调用OK
原因分析:
原因:https://blog.youkuaiyun.com/TheThirdMoon/article/details/109624711
参考这篇博客,大致知道原因是啥,为了确定真实状况,特在代码中增加日志打印:
Thread.currentThread();
Thread.currentThread().getContextClassLoader();
确认为多线程引起,类加载器相同。
解决方案:
确保 ThreadLocal 对象由同一个类加载器加载
使用 InheritableThreadLocal
对象,它会在子线程创建时从父线程继承 ThreadLocal
的值 。
public class InheritableThreadLocalDemo {
public static void main(String[] args) {
InheritableThreadLocal<String> inheritableThreadLocal = new InheritableThreadLocal<>();
inheritableThreadLocal.set("父线程数据");
new Thread(() -> {
System.out.println("子线程获取的数据:" + inheritableThreadLocal.get());
}).start();
}
}