2012-04-21 3 views
3

У меня есть следующие Protobuf тзды определены:Является ли protobuf в java потокобезопасным?

message Counts { 
    repeated int32 counts = 1; 
} 

, который распределяется между нитями R и W как строитель:

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 
} 

Но помните, что вы также должны убедиться, что там нет никаких условий гонки при построении сообщения; нить писателя не разрешается записывать после создания сообщения.