目的
减少方法入参, 一次请求处于相同的上下文中
例子代码
最近 Kevin 刚从迪士尼跳槽到字节跳动, 还没有过试用期就离职了, 安倍晋三也由于身体原因辞去日本首相的工作
我们先创建一个 ThreadLocal 的实例:
public static final ThreadLocal<User> INTEGER_THREAD_LOCAL= new ThreadLocal<>();
我们在多个线程中描述这个事情:
IntStream.range(1, 10) .parallel().forEach(i -> { try { final User user = new User(); user.setName("凯文·梅耶尔" + i); user.setPlace("字节跳动"); INTEGER_THREAD_LOCAL.set(user); print(); } finally { INTEGER_THREAD_LOCAL.remove(); }});
其中 print 方法的实现是:
public static void print() { System.out.println( INTEGER_THREAD_LOCAL.get() .getName() + "从" + INTEGER_THREAD_LOCAL.get() .getPlace() + "离开");}
最终输出:
凯文·梅耶尔3从字节跳动离开凯文·梅耶尔9从字节跳动离开凯文·梅耶尔2从字节跳动离开凯文·梅耶尔7从字节跳动离开凯文·梅耶尔5从字节跳动离开凯文·梅耶尔4从字节跳动离开凯文·梅耶尔6从字节跳动离开凯文·梅耶尔1从字节跳动离开凯文·梅耶尔8从字节跳动离开
一次请求可能会调用非常多的方法, 这些上下文比如 traceId, userId 之类的都是好多接口都需要使用的信息, 如果每个接口都提供这些的字段, 将会非常难以维护和调用这些代码
课后作业
-
了解 ThreadLocal 底层的数据结构
-
在从网关或者前端发送过来的请求, 将用户信息存储在 ThreadLocal 中消费
-
思考如何微服务如何达到类似于 ThreadLocal 这样的系统上下文
微信: