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

时间:2016-02-11 09:43:17

标签: java json jackson

杰克逊有ObjectReader和文档说你需要用它来保证线程安全。但我无法理解如何正确地做到这一点

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.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);
    }
}

我写了两个样本

  1. parseJson1() - 在每次解析时从ObjectMapper创建ObjectReader
  2. parseJson2() - 在ObjectReader上重用单个实例
  3. 其中哪一个是对的?

1 个答案:

答案 0 :(得分:5)

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

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

  

使用“流畅的”(或者,类型,构建器)模式,以便实例是不可变的(因此完全线程安全,没有外部同步);为不同的配置构建新实例。实例最初由ObjectMapper构造,可以重用,共享,缓存;这既是因为线程安全,也是因为实例相对较轻。