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

回到顶部