apache / apache/servicecomb-java-chassis
addLocalContext(parentContext.getLocalContext());多线程问题Concurrentmodificationexception Bug
- 主要语言
- Java
- 星标
- 1.9k
- 派生
- 814
- 平均合并
- 8 天 23 小时
- 30 天内合并 PR
- 1
描述
这个类有构造这个代码:
org.apache.servicecomb.swagger.invocation.SwaggerInvocation#SwaggerInvocation
public SwaggerInvocation() {
parentContext = ContextUtils.getInvocationContext();
if (parentContext != null) {
addContext(parentContext.getContext());
addLocalContext(parentContext.getLocalContext());
}
}
其中addLocalContext(parentContext.getLocalContext()); 里面调用了localContext.putAll(otherContext);
这个在多线程环境,业务代码自己开多线程调用下游服务传递上下文会有多线程问题,报Concurrentmodificationexception异常
建议使用public void setLocalContext(Map localContext)直接设置上下文
或者将
protected Map context = new HashMap<>();
protected Map localContext = new HashMap<>();
都换成ConcurrentMap
贡献指南
这个仓库没有索引到贡献指南
调研方向
从 org.apache.servicecomb.swagger.invocation.SwaggerInvocation#SwaggerInvocation 开始,检查 addLocalContext,尤其是 issue 中描述的 localContext.putAll 调用。比较提出的上下文处理替代方案,并验证在传播本地上下文时,并发的下游调用不会引发 ConcurrentModificationException。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- java
- 领域
- backend
- Issue 类型
- 缺陷
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 停滞
- 描述清晰度
- 基本清楚
- 新手友好度
- 40/100