ThreadLocal中存储用户id,但是使用多线程处理业务时ThreadLocal则无法获取,因为不是同一线程,如何解决?

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存在一些性能上的开销,因此,在需要高性能的场景下需要谨慎使用。