Java 使状态保持在一个不稳定的状态
netty文档建议在ChannelHandler中使用实例变量来跟踪通道状态。它没有提到您应该使用volatile变量或使用任何其他同步技术来确保线程之间存在一致的视图 例如,在每个连接的基础上使用此处理程序:Java 使状态保持在一个不稳定的状态,java,multithreading,netty,Java,Multithreading,Netty,netty文档建议在ChannelHandler中使用实例变量来跟踪通道状态。它没有提到您应该使用volatile变量或使用任何其他同步技术来确保线程之间存在一致的视图 例如,在每个连接的基础上使用此处理程序: class Handler extends SimpleChannelUpstreamHandler { int count = 0; @Override public void messageReceived(ChannelHandle
class Handler extends SimpleChannelUpstreamHandler {
int count = 0;
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
++count;
}
}
我预计来自netty线程池的许多不同线程将调用此方法,尽管不是并发的,并且可能会看到不一致的视图,从而导致不准确的计数
是这样吗?或者netty内部是否正在进行某种同步,从而导致写入计数字段被刷新 创建Netty
ChannelPipeline
时,如果将处理程序的相同的实例添加到所有通道,则会有多个线程读取/修改您的数据
如果在管道中为每个通道创建一个新的Handler
实例,如下所示,则您是安全的,此时只有一个线程一次访问管道中的处理程序
ChannelPipeline p = Channels.pipeline();
pipeline.addLast("handler", new Handler());
还可以看看Netty,它类似于javaThreadLocal
,如果管道中没有执行器,并且仅在I/O工作线程中执行处理程序,则可以基于每个通道设置状态,然后就可以了,因为Netty保证给定的管道实例总是从同一个工作线程回调
如果要向管道中添加执行处理程序,那么如果使用Netty的OrderedMemoryAwareThreadPoolExecutor,就可以了
如果您是从非Netty线程访问管道,或者管道中有非OrderedMemoryAwareThreadPoolExecutor,则需要同步
我建议您浏览一下Netty用户论坛档案中的以下内容
没错,我认为只有一个线程会同时访问处理程序,但这保证了访问处理程序的第二个线程会看到第一个线程所做的更改,除非netty正在执行易失性写入或其他保证可见性的操作谢谢!这就是我想要的,“Netty保证给定的管道实例总是从同一个工作线程回调”