首页 > Java >  Java 将 Jackson 的 ObjectMapper 声明为静态字段吗?

 Java 将 Jackson 的 ObjectMapper 声明为静态字段吗?

上一篇 下一篇

杰克逊图书馆的类似乎是线程安全的。ObjectMapper

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

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

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

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

分割线

网友回答:

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

您提到的页面中唯一需要注意的是,一旦共享映射器,就无法修改映射器的配置;但是您没有更改配置,所以这很好。如果您确实需要更改配置,则可以从静态块执行此操作,也可以。

编辑: (2013/10)

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

分割线

网友回答:

尽管 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】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 466次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 04-16
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
单页式简历模板 微信文章 响应式 自适应 html5 微信模板 微信公众平台 微信素材 企业网站 微信图片
您可能会喜欢的其他模板