线程共享变量使用不当引发血案
Posted daghai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程共享变量使用不当引发血案相关的知识,希望对你有一定的参考价值。
先说一下业务:
下单前需要先发送token等一些信息给到风控审核。实物订单和虚拟订单是独立的两个API接口。
token信息是放在ThreadLocal线程共享变量中,通过dubbo的RpcContext隐式传参透传到后台。后台获取token发送风控审核。
再谈问题,线上出现了很多虚拟订单发送了实物订单的token,且重复率比较高。
原因:虚拟订单由于失误,没有设置token到ThreadLocal线程共享变量中。导致后面获取token时,取到了遗留在线程中实物订单设置的token。由于tomcat线程池中线程复用,所以会出现重复率较高的情况。
大致流程如下:
问题分析的难点:
因为token属于敏感信息,生产环境不能打印到日志中,测试环境由于经常重启,很多线程变量未被实物订单的初始化,所以虚拟订单获取的token为空。没能复现生产中的问题。
该问题涉及的知识点还是比较多:
1,tomcat线程模型
2,线程共享变量使用
3,dubbo跨服务的传参
以上是关于线程共享变量使用不当引发血案的主要内容,如果未能解决你的问题,请参考以下文章
高并发多线程环境下如何保证共享变量的安全性?冰河建议你使用ThreadLocal,一文带你彻底搞懂ThreadLocal
高并发多线程环境下如何保证共享变量的安全性?冰河建议你使用ThreadLocal,一文带你彻底搞懂ThreadLocal
高并发多线程环境下如何保证共享变量的安全性?冰河建议你使用ThreadLocal,一文带你彻底搞懂ThreadLocal