我应该将 Jackson 的 ObjectMapper 声明为静态字段吗?

新手上路,请多包涵

Jackson 库的 ObjectMapper似乎是线程安全 的。

这是否意味着我应该将我的 ObjectMapper 声明为这样的静态字段

class Me {
    private static final ObjectMapper mapper = new ObjectMapper();
}

而不是像这样作为实例级字段?

 class Me {
    private final ObjectMapper mapper = new ObjectMapper();
}

原文由 Cheok Yan Cheng 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

是的,这是安全的,值得推荐。

您引用的页面中唯一需要注意的是,一旦共享映射器,您就无法修改它的配置;但是您没有更改配置,所以没关系。如果您确实需要更改配置,您可以从静态块中进行更改,这样也可以。

编辑:(2013/10)

对于 2.0 及更高版本,可以通过注意到有更好的方法来增强上述内容:使用 ObjectWriterObjectReader 对象,可以通过 ObjectMapper 构造它们是完全不可变的,线程安全的,这意味着它甚至在理论上不可能导致线程安全问题(如果代码尝试重新配置实例,则可能会发生 ObjectMapper )。

原文由 StaxMan 发布,翻译遵循 CC BY-SA 3.0 许可协议

尽管 ObjectMapper 是线程安全的,但我强烈反对将其声明为静态变量,尤其是在多线程应用程序中。甚至不是因为这是一种不好的做法,而是因为您面临着死锁的巨大风险。我是根据我自己的经历说的。我创建了一个具有 4 个相同线程的应用程序,这些线程从 Web 服务获取和处理 JSON 数据。根据线程转储,我的应用程序经常在执行以下命令时停止:

 Map aPage = mapper.readValue(reader, Map.class);

除此之外,性能并不好。当我用基于实例的变量替换静态变量时,停顿消失了,性能翻了两番。即在 40 分钟 56 秒内处理了 240 万个 JSON 文档,而不是之前的 2.5 小时。

原文由 Gary Greenberg 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题