-
Notifications
You must be signed in to change notification settings - Fork 511
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
[BUG] JSONFactory和ObjectReaderProvider静态代码循环依赖导致死锁 #2994
Comments
你提供的测试运用,我运行了很多次,都没有卡住。 |
我本地是100%复现的 不同配置的机器,可能要改一下下面代码中的停顿时间,模拟一下业务逻辑的耗时
|
@yhzdys 你有什么好的想法吗? |
解决循环依赖,一般是加个中间类来解决(没什么是加中间层解决不了的😂) ObjectReaderProvider用到了JSONFactory的方法有6个
我的想法是可以独立出一个JSONConfig类,把JSONFactory里的DEFAULT_PROPERTIES和is**搬到JSONConfig里面 |
@oldratlee @wenshao JSONFactory和ObjectReaderProvider,这2个类在静态初始化的时候,存在循环依赖,导致并发时死锁。 |
https://oss.sonatype.org/content/repositories/snapshots/com/alibaba/fastjson2/fastjson2/2.0.54-SNAPSHOT/ |
@wenshao 本地验证通过 |
问题描述
项目中的一些组件需要一个独立的JSONUtil工具类,通过自定义ObjectReaderProvider来实现一些自定义的逻辑。
在项目启动时,如果有多个并发请求同时调用JSON的静态方法和自定义的JSONUtil,有概率出现线程死锁。
排查下来的原因是:
类ObjectReaderProvider和JSONFactory的静态代码块出现了循环依赖。
类加载器在初始化class时会给上一个class级别的锁以保证类的static代码只执行一次。
ObjectReaderProvider中的static代码块需要依赖JSONFactory完成初始化,
但是JSONFactory中的defaultObjectReaderProvider静态属性需要依赖ObjectReaderProvider完成初始化。
环境信息
重现步骤
运行下面代码,可能出现死锁,导致系统无响应。
期待的正确结果
目前时通过JSONUtil中注释掉的方法来保证类的加载顺序一致。
但是这种静态代码循环依赖的形式,并非一种好的实现,一旦出现问题很难排查,或许有改进的必要?
相关日志输出
附加信息
The text was updated successfully, but these errors were encountered: