案例分享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线程安全疑问的主要内容,如果未能解决你的问题,请参考以下文章

Netty Channel.write 线程安全吗?

Java多线程-线程3大不安全案例

从其他应用程序线程写入Netty通道

JAVA线程安全的案例

java 多线程-线程不安全案例

案例-- 线程不安全对象(SimpleDateFormat)