threadlocal跨线程传递解决方案(下)
加下来说说InheritableThreadLocal的局限性:
看一个例子:
new了一个线程池大小为1的线程池。在第一次执行前,设置了一个wzAAA,在子线程执行获取,然后sleep(2000)以后,设置了一个另外的值。再次获取结果
看一下运行结果:
两次执行结果居然一样。。那么显然不是我们想要的结果。问题出在哪里?
原因是我们使用了固定为1的线程池,线程池中是缓存使用过的线程,当线程被重复调用的时候并没有再重新初始化init()线程,而是直接使用已经创建过的线程,所以这里的值并不会被再次操作。
那么如何解决这个问题:
阿里巴巴有个开源项目 :
https://github.com/alibaba/transmittable-thread-local
让我们看一下简介:
我们按照相关wiki进行改造
相关结果正确:
相关原理简介:
https://github.com/alibaba/transmittable-thread-local/blob/master/docs/developer-guide.md
其实在很多开源项目中,尤其是全链路传递实现,也有类似的实现:
比如sleuth:
在跨线程调用中。也是通过覆写runnable来实现来防止链路丢失
以上是 threadlocal跨线程传递解决方案(下) 的全部内容, 来源链接: utcz.com/z/512157.html