将事件写入Netty ChannelGroup会创建竞赛条件

将事件写入Netty ChannelGroup会创建竞赛条件,netty,Netty,我有一个事件需要发送到所有活动连接,我正在使用ChannelGroup.write()进行此过程。当事件通过出站处理程序时,在创建最终ByteBuf之前,会使用该连接的唯一值修改事件中的字段。我遇到的问题是ChannelGroup.write()向每个连接发送相同的事件,并且每个连接的出站处理程序修改该字段。这会创建竞争条件,并且我的事件的接收者可能会读取此字段中具有错误值的事件 我不知道如何解决这个问题。我可以编写自己的ChannelGroup write()方法,该方法将等待事件发送后再发送

我有一个事件需要发送到所有活动连接,我正在使用ChannelGroup.write()进行此过程。当事件通过出站处理程序时,在创建最终ByteBuf之前,会使用该连接的唯一值修改事件中的字段。我遇到的问题是ChannelGroup.write()向每个连接发送相同的事件,并且每个连接的出站处理程序修改该字段。这会创建竞争条件,并且我的事件的接收者可能会读取此字段中具有错误值的事件

我不知道如何解决这个问题。我可以编写自己的ChannelGroup write()方法,该方法将等待事件发送后再发送下一个事件。或者我可以创建我的事件的多个副本,并向每个连接发送一个副本。不管怎样,我似乎正在编写一些自定义代码


任何帮助都将不胜感激。

让我们从一句话开始,即在多线程环境中处理可变数据结构通常是个坏主意。努力创建一个不可变的类,并在进行变异时用新值复制它

采用这种方法:

您不必编写自己的
ChannelGroup.write()
实现。 您可以简单地复制事件对象,并在向前传递它之前,在处理程序中改变值,但更喜欢创建一个新的不可变事件


如果您坚持对所有线程使用相同的事件实例,则可以对要修改的字段使用ThreadLocal。我真的认为这对于您的用例来说是一种过度的杀伤力。

感谢您的快速响应。就像很多情况一样,我有一个遗留应用程序,我用Netty替换网络部分,并创建一个不可变的类,使我处于我不想去的领域。我将进一步研究你的建议。如果你不想在重构遗留代码时震惊世界,我认为你最好的选择是在变异对象之前,在处理程序中复制对象。这是一个很小的改变,除非这是一个有很多字段并且没有副本的类。