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

Naw*_*awa 6 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我写了两个样本

  1. parseJson1() -在每次解析时从ObjectMapper创建ObjectReader
  2. parseJson2() -在ObjectReader上重用单个实例

他们中哪一个是对的?

vvg*_*vvg 8

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

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

使用“流利的”(或某种类型的构建器)模式,以便实例是不可变的(因此完全线程安全,无需外部同步);为不同的配置构建了新实例。实例最初由ObjectMapper构造,并且可以重用,共享,缓存;既是由于线程安全,又因为实例相对较轻。