ThreadLocal中存储用户id,但是使用多线程处理业务时ThreadLocal则无法获取,因为不是同一线程。现在我不想使用全局变量传参,而是还可以在多线程中从ThreadLocal中获取并且值不变,MDC可以解决但是不是完全理解,还望各位指教😀
参考GPT和自己的思路:
ThreadLocal中存储的值只能在同一个线程内获取,如果在多线程处理业务时需要从ThreadLocal中获取值,并且值不能改变,可以考虑使用InheritableThreadLocal。
InheritableThreadLocal可以实现不同线程间的值传递。当子线程被创建时,子线程会继承父线程中的InheritableThreadLocal值,子线程的修改不会影响父线程中的值。具体实现方法如下:
public class MyThreadLocal {
public static InheritableThreadLocal<Long> userThreadLocal = new InheritableThreadLocal<>();
public static void set(Long value) {
userThreadLocal.set(value);
}
public static Long get() {
return userThreadLocal.get();
}
public static void remove() {
userThreadLocal.remove();
}
}
// 在主线程中设置值
MyThreadLocal.set(userId);
// 在子线程中获取值
Long userId = MyThreadLocal.get();
当然,MDC也可以实现多线程中传递值的需求,但其使用场景更多的是日志记录,不符合本问题的要求。
参考GPT和自己的思路:
你可以尝试使用InheritableThreadLocal类,这个类是ThreadLocal的一个子类,它可以在创建新线程时把父线程中的值传递到新的子线程中,从而实现在多线程中能够获取并且值不变的效果。
具体使用方法是,将ThreadLocal改成InheritableThreadLocal即可,例如:
private static final InheritableThreadLocal<Long> userIdThreadLocal = new InheritableThreadLocal<>();
//在父线程中设置值
userIdThreadLocal.set(userId);
//在子线程中获取值
Long userId = userIdThreadLocal.get();
注意,使用InheritableThreadLocal存在一些性能上的开销,因此,在需要高性能的场景下需要谨慎使用。