案例分享Netty线程安全疑问
Posted Netty之家
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了案例分享Netty线程安全疑问相关的知识,希望对你有一定的参考价值。
Netty线程安全疑问
问题:我有一个非线程安全的类ThreadUnsafeClass,这个类会在channelRead方法中被调用。我下面这样的调用方法在多线程环境下安全吗?谢谢!
代码示例如下:
public class MyHandler extends ChannelInboundHandlerAdapter {
private ThreadUnsafeClass unsafe = new ThreadUnsafeClass();
public void channelRead(ChannelHandlerContext ctx, Object msg) {
//下面的代码是否ok?
unsafe.doSomething(ctx, msg);
}
......
}
解答:Netty 4优化了Netty 3的线程模型,其中一个非常大的优化就是用户不需要再担心ChannelHandler会被并发调用,总结如下:
ChannelHandler's的方法不会被Netty并发调用;
用户不再需要对ChannelHandler的各个方法做同步保护;
ChannelHandler实例不允许被多次添加到ChannelPiple中,否则线程安全将得不到保证
根据上述分析,MyHandler的channelRead方法不会被并发调用,因此不存在线程安全问题。
特例:ChannelHandler的线程安全存在几个特例,总结如下:
如果ChannelHandler被注解为 @Sharable,全局只有一个handler实例,它会被多个Channel的Pipeline共享,会被多线程并发调用,因此它不是线程安全的;
如果存在跨ChannelHandler的实例级变量共享,需要特别注意,它可能不是线程安全的
非线程安全的跨ChannelHandler变量原理如下:
以上是关于案例分享Netty线程安全疑问的主要内容,如果未能解决你的问题,请参考以下文章