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

Dim*_*ima 5 java serialization multithreading 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):
       }
    }
Run Code Online (Sandbox Code Playgroud)

问题是我是否可以/应该通过重用编码器和编写器来优化它,如果我应该这样做,正确的方法是什么:我可以预先初始化编写器并使其final例如,还是需要是一个ThreadLocal

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

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

另外,我假设,无论我在这里得到什么答案,也适用于阅读/解码。那正确吗?

感谢任何指针。

谢谢!

小智 2

根据这篇文章

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

Writer 也是线程安全的。

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