Java Avro序列化:哪些部件是和不是';t线程安全?
我在网上不同的地方看到了一些相互矛盾的信息,所以我希望有人能给我一个权威性的回答,谁知道呢 假设我正在将一些内容序列化到avro:Java Avro序列化:哪些部件是和不是';t线程安全?,java,multithreading,serialization,avro,Java,Multithreading,Serialization,Avro,我在网上不同的地方看到了一些相互矛盾的信息,所以我希望有人能给我一个权威性的回答,谁知道呢 假设我正在将一些内容序列化到avro: class StuffToAvro { private final Schema schema; StuffToAvro(Schema schema) { this.schema = schema } void apply(GenericRecord stuff, OutputStream out) {
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
关于编码器的一个类似问题:我应该记住上一个实例并将其传递给getbinarycoder
以重用,还是也需要一个ThreadLocal
在每种情况下,如果答案是ThreadLocal
,我还想知道这样的优化是否值得这么复杂:每次创建一个全新的编写器和/或编码器而不是重用它们是否真的很昂贵
此外,我假设,无论我在这里得到什么答案,也适用于阅读/解码。是这样吗
感谢你的指点
谢谢大家! 根据这个
是的,一个DatumReader实例可以在多个线程中使用。编码器
和解码器不是线程安全的,但DatumReader和DatumWriter是线程安全的
写入程序也是线程安全的
是,重新使用单个GenericDatumWriter写入多个对象
应该提高绩效