2012-04-21 63 views
3

我有以下的protobuf MSG定义:是java中的protobuf线程安全的吗?

message Counts { 
    repeated int32 counts = 1; 
} 

该线程RW之间共享作为助洗剂:

private final Counts.Builder countsBuilder; 

螺纹R将只从countsBuilder读取和W将只写入countsBuilder 。 共享构建器将被读取,写入并且(在某个时候)通过网络发送构建&。 AFAIK,对消息的并发读取是正常的,但其他任何事情都必须由开发人员在更高级别进行同步?那么,我实际上无法同时写入和阅读共享的构建器?

如果这不是固有的线程安全的,我正在考虑使用某种线程安全的Collection<Integer>,我将用它来读/写,并将在发送之前创建一个全新的消息它通过网络。或者我错过了什么?

谢谢!

EDIT 1:我使用的protobuf 2.4.1和java 6

编辑2:一些术语和拼写修复。

+2

你将如何*建议*“写入共享信息”?消息是不可变的。你必须写信给* builder *。 – 2012-04-21 11:45:34

+0

糟糕,我相信我使用了错误的术语。我会写信给建设者,并在发送时转换为消息。 – Howie 2012-04-21 12:04:29

回答

1

如果同步你都读写道:你应该罚款:

synchronized (countsBuilder) { 
    // modify countsBuilder 
} 

但请记住,你还需要确保有没有建立该消息时任何种族的条件;编写器线程不允许在消息生成后进行任何写操作。

相关问题