我正在实现ChannelInboundHandlerAdapter
,并且对并发性有疑问。是否有必要使其线程安全?我的意思是我必须为每个客户端的 session 存储一些状态。
public class Impl extends ChannelInboundHandlerAdapter{
private List<Integer> someState;
//
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
int size = someState.size(); //Should I worry about memory consitency here?
//...
}
}
事情是,如果从一个请求到另一个请求
channelRead
方法被不同的线程调用,那么我将不得不放置一些内存障碍。有必要吗?还是
Netty
自己照顾它? 最佳答案
对于Netty 4.x
Well-defined thread model
尽管尝试修复3.5中的不一致问题,但3.x中没有明确定义的线程模型。 4.0定义了一个严格的线程模型,可以帮助用户编写ChannelHandler而不用过多担心线程安全性。
除非使用@Sharable注释ChannelHandler,否则Netty永远不会同时调用ChannelHandler的方法。 这与处理程序方法的类型无关-入站,出站或生命周期事件处理程序方法。
(强调是我的)