Jackson ObjectMapper& JsonGenerator - 它是线程安全的吗?

时间:2014-01-06 18:08:34

标签: java json fasterxml

我目前有一个项目使用jackson rapid xml来使用自定义序列化器和反序列化器将POJO序列化/反序列化为Json。据我所知,ObjectMapper一旦创建和配置就是线程安全的。但是,我注意到在使用JMeter运行测试时偶尔会发生以下情况 -

  • 线程1进入CustomerSerializer并开始序列化
  • 线程2进入CustomSerializer,中断线程1,并从头到尾开始序列化
  • 线程1恢复,最后被序列化的东西丢失

似乎是当第二个线程进入时JsonGenerator实例被重置 - 当然这不应该发生?我检查了几个站点和线程,看看是否有我需要设置的设置或功能,但据我所知,ObjectMapper重用JsonGenerator实例,这可能是问题吗?

以下是我自定义序列化程序的片段...

@Override
public final void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {

    jsonGenerator.writeStartObject();

    ... Code here ....

    jsonGenerator.writeEndObject();

    closeJsonGenerator(jsonGenerator);
}

以及使用它的一个例子

SimpleModule sm = new SimpleModule();
sm.addSerializer(new myCustomSerializer());
new ObjectMapper().registerModule(sm)
                  .writeValue(new myObject());

1 个答案:

答案 0 :(得分:6)

杰克逊的ObjectMapper在每个序列化请求上创建一个新的JsonGenerator。从这个意义上说,它保证是线程安全的。我能看到的唯一可能导致您看到的行为的是CustomSerializer是否有一些正在共享的实例字段,并且正在进行某种内部同步。