将事件写入 Netty ChannelGroup 会产生竞争条件
Writing an event to a Netty ChannelGroup creates race condition
我有一个事件需要发送到所有活动连接,我正在使用 ChannelGroup.write() 进行此过程。当事件通过出站处理程序时,在创建最终的 ByteBuf 之前,事件中的一个字段被修改为该连接的唯一值。我遇到的问题是 ChannelGroup.write() 向每个连接发送相同的事件,并且每个连接的出站处理程序都会修改该字段。这会产生竞争条件,我的事件的接收者可能会读取此字段中具有不正确值的事件。
我不知道如何解决这个问题。我可以编写自己的 ChannelGroup write() 方法,该方法会等到一个事件发送完毕,然后再发送下一个事件。或者我可以创建我的事件的多个副本并向每个连接发送一个。无论哪种方式,我似乎都在编写一些自定义代码。
如有任何帮助,我们将不胜感激。
让我们先从以下声明开始:在多线程环境中使用可变数据结构通常不是一个好主意。努力创建一个不可变的class,并在进行突变时用新值复制它。
采用这种方法:
您不必编写自己的 ChannelGroup.write()
实现。
您可以简单地复制事件对象,并在继续传递它之前在您的处理程序中改变值,但更喜欢创建一个新的不可变事件。
如果您坚持对所有线程使用相同的事件实例,您可以对要改变的字段使用 ThreadLocal。我真的认为这对您的用例来说太过分了。
我有一个事件需要发送到所有活动连接,我正在使用 ChannelGroup.write() 进行此过程。当事件通过出站处理程序时,在创建最终的 ByteBuf 之前,事件中的一个字段被修改为该连接的唯一值。我遇到的问题是 ChannelGroup.write() 向每个连接发送相同的事件,并且每个连接的出站处理程序都会修改该字段。这会产生竞争条件,我的事件的接收者可能会读取此字段中具有不正确值的事件。
我不知道如何解决这个问题。我可以编写自己的 ChannelGroup write() 方法,该方法会等到一个事件发送完毕,然后再发送下一个事件。或者我可以创建我的事件的多个副本并向每个连接发送一个。无论哪种方式,我似乎都在编写一些自定义代码。
如有任何帮助,我们将不胜感激。
让我们先从以下声明开始:在多线程环境中使用可变数据结构通常不是一个好主意。努力创建一个不可变的class,并在进行突变时用新值复制它。
采用这种方法:
您不必编写自己的 ChannelGroup.write()
实现。
您可以简单地复制事件对象,并在继续传递它之前在您的处理程序中改变值,但更喜欢创建一个新的不可变事件。
如果您坚持对所有线程使用相同的事件实例,您可以对要改变的字段使用 ThreadLocal。我真的认为这对您的用例来说太过分了。