ThreadLocal实战(三:TransmittableThr

2018-08-30  本文已影响0人  但时间也偷换概念

引子

上两篇博客讲了ThreadLocal和InheritableThreadLocal,InheritableThreadLocal能够进行父子线程数据传递,但它也有缺陷,比如线程池搭配ThreadLocal问题。ThreadLocal在线程池场景下,会因为线程池核心线程的复用性,带来“脏数据”。

样例:

接着上篇博客的案例,我现在使用InheritableThreadLocal搭配线程池使用,模拟开发中的场景。

线程池复用问题 线程池配置

如上图,我设置了核心线程数为1的线程池,那么在线程池核心线程闲置的时候,将复用核心线程,所以第二次启动线程的时候,并没有创建新的线程,于是我在主线程remove ThreadLocal以后,第二个线程还是打印第一个线程的上下文环境出来了。

这就是线程池情况下复用线程带来的脏数据问题

当我们换上ttl

TransmittableThreadLocal TransmittableThreadLocal测试结果

成功解决此问题。

核心操作两步:

1.包裹TtlExecutors

2.使用TransmittableThreadLocal

TtlExecutors

TtlExecutors就是做了一层wrapper

项目代码:https://github.com/Spring5945/Concurrent

上一篇下一篇

猜你喜欢

热点阅读