Avro序列化:哪些部分是线程安全的?

时间:2017-05-03 12:55:34

标签: java multithreading serialization avro

我在网上的不同地方看到了一些有关此信息的相互矛盾的信息,所以真正了解的人会非常感谢和权威回答。

假设,我正在将某些内容序列化为avro:

    class StuffToAvro {
       private final Schema schema;
       StuffToAvro(Schema schema) { this.schema = schema }

       void apply(GenericRecord stuff, OutputStream out) {
         final Encoder encoder = EncoderFactory.get.binaryEncoder(out, null);
         final GenericDatumWriter writer = new GenericDatumWriter(schema);
         writer.write(stuff, encoder):
       }
    }

问题是我是否可以/应该通过重用编码器和编写器来优化它,如果我应该,那么正确的方法是什么:我可以先预先编写作者并使其成为final例如,还是需要ThreadLocal

关于编码器的类似问题:我应该记住上一个实例并将其传递给getBinaryEncoder以重复使用,还是需要ThreadLocal

在每种情况下,如果答案是ThreadLocal,我还想知道这种优化是否值得复杂:每次创建一个全新的编写器和/或编码器实际上是昂贵的,而不是重用它们?

另外,我假设,无论我得到什么答案,也适用于阅读/解码。是吗?

欣赏任何指针。

谢谢!

1 个答案:

答案 0 :(得分:0)

为此post

  

是的,可以在多个线程中使用DatumReader实例。编码器   和Decoder不是线程安全的,但是DatumReader和DatumWriter是安全的。

编写器也是线程安全的。

  

是,重新使用单个GenericDatumWriter写入多个对象   应该提高性能。