调用【com.alibaba.fastjson2.JSON#parseObject(byte[], java.lang.Class<T>, com.alibaba.fastjson2.filter.Filter, com.alibaba.fastjson2.JSONReader.Feature...)】出现报错【java.util.ConcurrentModificationException】
- Dominant language
- Java
- Stars
- 4.4k
- Forks
- 613
- Avg merge
- 1d 22h
- Merged PRs (30d)
- 6
Description
### 问题描述
服务里面引用了canal-client1.1.8、rocketmq-client 4.9.8,以及fastjson2 2.0.54,启动的时候会去初始化canal-client 以及 rocketMq的producer。在启动过程中fastjson2出现报错【java.util.ConcurrentModificationException】

### 环境信息
- OS信息: [Ubuntu 20.04.2 LTS]
- JDK信息: [JDK 11]
- fastjson version:[e.g.:Fastjson2 2.0.54]
- mysql version: 8.0.29
- canal version: 1.1.8
- rocketmq-client version: 4.9.8
### 重现步骤
1. 引入rocketmq,并去使用它
2. 在spring容器启动过程中,去使用【com.alibaba.fastjson2.JSON#parseObject(byte[], java.lang.Class, com.alibaba.fastjson2.filter.Filter, com.alibaba.fastjson2.JSONReader.Feature...)】
3. 出现【java.util.ConcurrentModificationException】错误
### 原因
rocketmq 在启动的过程会去注册多个module,如下

然后在启动的同时,由于我们使用了canal client,会去调用到【com.alibaba.fastjson2.JSON#parseObject(byte[], java.lang.Class, com.alibaba.fastjson2.filter.Filter, com.alibaba.fastjson2.JSONReader.Feature...)】,最后触发【com.alibaba.fastjson2.reader.ObjectReaderProvider#getObjectReaderInternal】,会去遍历modules,由于modules不是线程安全的,导致报错!

### 解决方案
我的想法有两个:
1.使用for (int i = 0; i < modules.size(); i++) {} 去避免报错,但这种只能应对添加module导致的报错,无法避免移除module导致的报错(虽然很少会有人会去移除module)
2.(推荐)把modules类型改成线程安全的CopyOnWriteArrayList,虽然会影响到添加/删除modules的效率,但对于modules来说,查询场景远远大于添加/删除场景,这样可以彻底解决【java.util.ConcurrentModificationException】错误
如果认定这是一个 bug,我可以尝试提交修改的 PR ~~~
Contributor guide
Research direction
Start with ObjectReaderProvider#getObjectReaderInternal and the modules collection used by JSON#parseObject(byte[], Class, Filter, JSONReader.Feature...). Reproduce startup with RocketMQ and Canal initialization on JDK 11, then verify that concurrent module registration and reader lookup no longer produce ConcurrentModificationException.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java
- Domain
- backend
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 25/100