Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is protobuf in java thread-safe?

I have the following protobuf msg defined:

message Counts {
    repeated int32 counts = 1;
}

which is shared between threads R and W as a builder:

private final Counts.Builder countsBuilder;

Thread R will only read from countsBuilder and W will only write to countsBuilder. The shared builder will be read, written-to and (at some point) built & sent over the network.

AFAIK, concurrent reads to messages are fine, but anything else must be synchronized at a higher level by the developer? So, I can't actually write and read to the shared builder at the same time?

If this is not inherently thread-safe, I'm thinking of using some kind of thread-safe Collection<Integer> which I'll use for reading/writing and will (at some point) create a brand new message right before sending it over the network. Or am I missing something?

Thanks!

EDIT 1: I'm using protobuf 2.4.1 and java 6

EDIT 2: Some terminology and spelling fixes.

like image 530
Howie Avatar asked Oct 08 '22 01:10

Howie


1 Answers

You should be fine if you synchronize both your read and writes:

synchronized (countsBuilder) {
   // modify countsBuilder
}

But remember that you also need to make sure that there aren't any race conditions when building the message; the writer thread is not allowed to make any writes after the message has been built.

like image 176
JesperE Avatar answered Oct 13 '22 12:10

JesperE