ThreadLocal实战(三:TransmittableThr
2018-08-30 本文已影响0人
但时间也偷换概念
引子:
上两篇博客讲了ThreadLocal和InheritableThreadLocal,InheritableThreadLocal能够进行父子线程数据传递,但它也有缺陷,比如线程池搭配ThreadLocal问题。ThreadLocal在线程池场景下,会因为线程池核心线程的复用性,带来“脏数据”。
样例:
接着上篇博客的案例,我现在使用InheritableThreadLocal搭配线程池使用,模拟开发中的场景。
线程池复用问题 线程池配置如上图,我设置了核心线程数为1的线程池,那么在线程池核心线程闲置的时候,将复用核心线程,所以第二次启动线程的时候,并没有创建新的线程,于是我在主线程remove ThreadLocal以后,第二个线程还是打印第一个线程的上下文环境出来了。
这就是线程池情况下复用线程带来的脏数据问题
当我们换上ttl
TransmittableThreadLocal TransmittableThreadLocal测试结果成功解决此问题。
核心操作两步:
1.包裹TtlExecutors
2.使用TransmittableThreadLocal
TtlExecutorsTtlExecutors就是做了一层wrapper
项目代码:https://github.com/Spring5945/Concurrent