java 如何正确和线程安全地重用 Jackson ObjectReader?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/35335646/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-03 00:01:09  来源:igfitidea点击:

How correctly and thread safe reuse Hymanson ObjectReader?

javajsonHymanson

提问by Nawa

Hymanson have ObjectReader and documentation says that you need to use it for thread safety. But I can't understand how to do it correctly

Hymanson 有 ObjectReader 并且文档说你需要使用它来保证线程安全。但我不明白如何正确地做到这一点

import com.fasterxml.Hymanson.databind.ObjectMapper;
import com.fasterxml.Hymanson.databind.ObjectReader;

import java.io.IOException;
import java.util.Map;

public class JsonParser {
    private ObjectMapper OBJECT_MAPPER = new ObjectMapper();
    private ObjectReader OBJECT_READER = new ObjectMapper().readerFor(Map.class);

    public Map<String, String> parseJson1(String json) throws IOException {
        ObjectReader objectReader = OBJECT_MAPPER.readerFor(Map.class);
        return objectReader.readValue(json);
    }

    public Map<String, String> parseJson2(String json) throws IOException {
        return OBJECT_READER.readValue(json);
    }
}

I wrote two samples

我写了两个样本

  1. parseJson1()- creates ObjectReader from ObjectMapper on each parsing
  2. parseJson2()- reuses single instance on ObjectReader
  1. parseJson1()- 在每次解析时从 ObjectMapper 创建 ObjectReader
  2. parseJson2()- 在 ObjectReader 上重用单个实例

Which of them is right?

他们哪个是对的?

回答by vvg

Documentation said it's "fully thread-safe" it means you can use parseJson2safely without worring about invoking this method in concurrent threads.

文档说它是“完全线程安全的”,这意味着您可以parseJson2安全地使用,而不必担心在并发线程中调用此方法。

https://fasterxml.github.io/Hymanson-databind/javadoc/2.5/com/fasterxml/Hymanson/databind/ObjectReader.html

https://fasterxml.github.io/Hymanson-databind/javadoc/2.5/com/fasterxml/Hymanson/databind/ObjectReader.html

Uses "fluent" (or, kind of, builder) pattern so that instances are immutable (and thus fully thread-safe with no external synchronization); new instances are constructed for different configurations. Instances are initially constructed by ObjectMapper and can be reused, shared, cached; both because of thread-safety and because instances are relatively light-weight.

使用“流畅”(或某种构建器)模式,因此实例是不可变的(因此完全线程安全,没有外部同步);新实例是为不同的配置构建的。实例最初由 ObjectMapper 构造,可以复用、共享、缓存;一方面是因为线程安全,另一方面是因为实例相对较轻。