我有一个事件需要发送到所有活动连接,我正在使用ChannelGroup.write()进行此过程。当事件通过出站处理程序时,在创建最终的ByteBuf之前,会使用该连接的唯一值修改事件中的字段。我遇到的问题是ChannelGroup.write()向每个连接发送相同的事件,每个连接的出站处理程序修改一个字段。这会产生竞争条件,我的事件的接收者可能会在此字段中读取值不正确的事件。
我不确定如何解决这个问题。我可以编写自己的ChannelGroup write()方法,该方法将等到发送下一个事件之前发送事件。或者我可以创建我的事件的多个副本并向每个连接发送一个副本。无论哪种方式,我似乎正在编写一些自定义代码。
非常感谢任何帮助。
答案 0 :(得分:1)
让我们从在多线程环境中使用可变数据结构的声明开始通常是一个坏主意。努力创建一个不可变的类,并在进行变异时使用新值复制它。
采用这种方法:
您不必编写自己的ChannelGroup.write()
实现。
您可以简单地复制事件对象,并在向前传递之前改变处理程序中的值,但更喜欢创建新的不可变事件。
如果您坚持为所有线程使用相同的事件实例,则可以将ThreadLocal用于您正在变异的字段。我认为这对你的用例来说太过分了。