当前位置: 首页 > 知识库问答 >
问题:

Jackson ObjectMapper和JSONGenerator--它是线程安全的吗?

梅跃
2023-03-14

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

  • 线程1进入CustomerSerializer并开始序列化
  • 线程2进入CustomSerializer,插入线程1,并从头到尾开始序列化
  • 线程1恢复,最后一个序列化的内容丢失

下面是我的自定义序列化程序中的一个片段...

@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个答案

岳飞航
2023-03-14

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

 类似资料:
  • 问题内容: 我目前有一个项目,该项目使用杰克逊更快的xml使用自定义序列化器和反序列化器将POJO序列化/反序列化到Json。据我了解,一旦创建并配置了ObjectMapper,它就是线程安全的。但是,我注意到使用JMeter运行测试时,偶尔会发生以下情况- 线程1进入CustomerSerializer并开始序列化 线程2进入CustomSerializer,与线程1交互,并开始从头到尾进行序列

  • 问题内容: 在中,此变量被声明为是我的问题,在某些调用之后检查值还是在多线程代码中使用perror()是安全的。这是线程安全变量吗?如果没有,那还有什么选择呢? 我在x86体系结构上将Linux与gcc一起使用。 问题答案: 是的,它是线程安全的。在Linux上,全局errno变量是特定于线程的。POSIX要求errno必须是线程安全的。 参见http://www.unix.org/whitepa

  • 问题内容: 我们在项目中使用了Drools kieSessions。许多线程可以创建新的kieSession。有时在创建会话时线程可能会挂起。因此,问题是: 首先 是kieContainer.newKieSession线程安全操作吗? 上吊的原因可能是肮脏的文字或阅读的kie会话集之类的东西吗? 问题答案: 当我在实践中检查 不是线程安全的操作。

  • 问题内容: 在Java中:线程安全吗,即返回的迭代器是在任何时候反映列表的当前状态,还是仅在创建列表时反映列表的状态? 问题答案: List.iterator()的行为未定义或与其他List实现保持一致。 对于ArrayList,LinkedList,如果在迭代列表时对其进行了修改,则可以获得ConcurrentModificationException。(这不能保证)避免此问题的方法是使用syn

  • 在我的应用程序中,我使用多个线程来处理客户端连接。 我在调试时发现了一个非常奇怪的行为——我有一个SelectionKey,通过调用(使用调试器)它的interestTops()方法,返回值是1(READ),但当我将数据发送到与该键对应的套接字时,选择器不会被唤醒。。 如果使用调试器,我将特定选择键更改为1(即使是1),选择器会突然对该更改做出反应。 在给定的时间内,我只有一个线程处理一个连接,但

  • 我看到了不同的PHP二进制文件,比如非线程或线程安全? 这是什么意思? 这些软件包之间有什么区别?