第一次看到ThreadLocal是jfinal-weixin的项目中,多公众号的实现方法,才知道这个“好东西”,实在太方便了,可以打通单一线程内任意地方的数据交流,传递一些当前会话的“全局变量”,或者业务端唯一性标识的信息,有了解过或者看过jfinal-weixin源码或者知道shiro的都应该能体会这玩意有多好用多方便。颇有刚学c语言的时候,全局变量打天下,goto语句随意跳转的快感。
就这么一个“好东西”,如果没用好还是会整出不少严重的bug,线程内set了之后线程结束前“必须一定务必”要remove,否则线程回到线程池之后,内容会溢出到其它session。这个问题导致的bug一直让我头疼,只能严格遵守往TL里set东西之后要尽快remove掉,或者用try{}finally{}来确保无论如何都完成这个步骤。但,总有人为疏忽的时候,或者未知的流程下触发这个溢出问题。
网上看了很多没有找到特别好的办法解决这个问题,只了解到FastThreadLocal就专门解决这个痛点,并且还达到更高的性能和安全性,自动释放,然而必须结合Netty的FastThread线程池来实现,否则在普通线程下会退化为SlowThreadLocal,即jdk原本的实现。这个线程池分配好像不是可以随便改的,目前我们新开发的项目用的是Jboot框架,undertow运行,根据我的了解线程池是在undertow这层管理的。
那么,各位大佬有在用到ThreadLocal开发的吗,有遇到我类似的痛点问题吗,你们是怎么优雅的处理的。或者,没有使用TL的大佬有没有使用类似特性的玩意呢。又或者是完全舍弃这种特性,用别的思路或者设计来达到相同效果的。
欢迎一起讨论,一起学习,进步!