2012-04-21 4 views
3

は、私は、次のいるProtobufのmsgが定義されています:ビルダーとしてのスレッドRWの間で共有されるJavaのprotobufはスレッドセーフですか?

message Counts { 
    repeated int32 counts = 1; 
} 

private final Counts.Builder countsBuilder; 

スレッドがRのみcountsBuilderから読み込まれますとWだけcountsBuilderに書き込みます。 共有ビルダーは、ネットワークを介して送信され、書き込まれ、(ある時点で)&がビルドされます。

AFAIKでは、メッセージへの同時読み取りは問題ありませんが、他のものは開発者がより高いレベルで同期する必要がありますか?だから、私は実際に共有ビルダーに同時に書き込んだり読んだりできません。

これは本質的にスレッドセーフではない場合は、スレッドセーフであるCollection<Integer>を使用して読み書きすることを考えています。送信する前に新しいメッセージを作成しますそれはネットワークを介して。または私は何かを逃している?

ありがとうございます!

EDIT 1:一部の用語やスペルの修正:私はいるProtobuf 2.4.1およびJava 6

EDIT 2を使用しています。

+2

「共有メッセージへの書き込み」をどのように提案しますか?メッセージは不変です。ビルダー*に書き込む必要があります。 –

+0

おっと、私は間違った用語を使用したと思います。私はビルダーに書いて、送信時にメッセージに変換します。 – Howie

答えて

1

あなたは両方のあなたのの書き込み読ん同期場合は問題ないはず:

synchronized (countsBuilder) { 
    // modify countsBuilder 
} 

をしかし、あなたはまた、メッセージを構築する任意の競合状態がないことを確認する必要があることを覚えておいてください。メッセージが作成された後にライタースレッドは書き込みを行うことができません。

関連する問題