【发布时间】:2018-06-07 05:51:08
【问题描述】:
背景:我的代码库有很多模块,根据一些分析,创建 Guice 注入器需要大量时间。这几乎可以肯定是由于大量的模块和一些需要很长时间配置的模块的存在。理论上,我可以生成 2+ 个可以单独配置的模块列表。
有没有办法并行化这些模块的配置?
例如,如果有办法合并或合并两个 Guice 注入器,我可以在单独的线程中创建它们,然后再加入它们。
【问题讨论】:
背景:我的代码库有很多模块,根据一些分析,创建 Guice 注入器需要大量时间。这几乎可以肯定是由于大量的模块和一些需要很长时间配置的模块的存在。理论上,我可以生成 2+ 个可以单独配置的模块列表。
有没有办法并行化这些模块的配置?
例如,如果有办法合并或合并两个 Guice 注入器,我可以在单独的线程中创建它们,然后再加入它们。
【问题讨论】:
您可能想使用 Netflix 的 Concurrent Singleton 库,它允许您以并发方式延迟加载 Guice 模块。
https://github.com/Netflix/governator/wiki/Concurrent-Singleton
Guice 的默认 Singleton 范围同步所有对象的创建 单锁(见这里)。这样做是为了避免循环死锁 依赖项。 Governator 添加 FineGrainedLazySingleton 注解 锁定 Guice Key 以便可以创建多个单例 同时。循环依赖很少见,所以 FineGrainedLazySingleton 在这些情况下可能会出现死锁,因为 更好的并发性的好处。
使用 FineGrainedLazySingleton 注释的类将是
- 懒惰地创建(如 Lazy Singleton)
- 由 FineGrainedLazySingletonScope 创建,它在 Guice Key 而不是 InternalInjectorCreator.class)
- 能够与其他 FineGrainedLazySingleton 一起创建 不同的线程
【讨论】: