-
Notifications
You must be signed in to change notification settings - Fork 510
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in 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: