杰克逊图书馆的类似乎是线程安全的。ObjectMapper
这是否意味着我应该像这样将 my 声明为静态字段ObjectMapper
class Me {
private static final ObjectMapper mapper = new ObjectMapper();
}
而不是像这样的实例级字段?
class Me {
private final ObjectMapper mapper = new ObjectMapper();
}
是的,这是安全的,值得推荐。
您提到的页面中唯一需要注意的是,一旦共享映射器,就无法修改映射器的配置;但是您没有更改配置,所以这很好。如果您确实需要更改配置,则可以从静态块执行此操作,也可以。
编辑: (2013/10)
对于 2.0 及更高版本,可以通过注意到还有更好的方法来增强上述内容:使用和对象,可以通过 .
它们是完全不可变的,线程安全的,这意味着理论上甚至不可能引起线程安全问题(如果代码尝试重新配置实例,则可能会发生这种情况)。ObjectWriter
ObjectReader
ObjectMapper
ObjectMapper
尽管 ObjectMapper 是线程安全的,但我强烈建议不要将其声明为静态变量,尤其是在多线程应用程序中。
甚至不是因为这是一种不好的做法,而是因为您冒着死锁的严重风险。我是根据我自己的经验说的。我创建了一个具有 4 个相同线程的应用程序,这些线程从 Web 服务获取和处理 JSON 数据。
根据线程转储,我的应用程序经常在以下命令上停滞不前:
Map aPage = mapper.readValue(reader, Map.class);
除此之外,性能也不好。
当我用基于实例的变量替换静态变量时,停滞消失了,性能翻了两番。即在 2 分 4 秒内处理了 40 万个 JSON 文档,而不是之前的 56.2 小时。
如果您不想将其定义为静态最终变量,但想节省一点开销并保证线程安全,我从此 PR 中学到了一个技巧。
private static final ThreadLocal<ObjectMapper> om = new ThreadLocal<ObjectMapper>() {
@Override
protected ObjectMapper initialValue() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return objectMapper;
}
};
public static ObjectMapper getObjectMapper() {
return om.get();
}
归功于作者。
模板简介:该模板名称为【 Java 将 Jackson 的 ObjectMapper 声明为静态字段吗?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Java】栏目查找您需要的精美模板。