背景-netty作为Server端
默认情况下,netty会用worker线程去处理我们的业务逻辑,默认流程如下。
但是这样就会有个问题:
在netty里面,一个SocketChannel会跟一个worker线程绑定,一个worker线程可以处理SocketChannel,假设有时候处理某个SocketChannel耗时较久,就会导致这个worker线程被霸占着,跟这个worker线程绑定的其它SocketChannel得不到处理。
所以可以考虑把worker线程干的事情分工一下,让worker线程只负责从接收SocketChannel和把结果响应回去,中间耗时的业务逻辑就交给另外一个线程池去完成。
如果我们按照常规的方式,使用一个线程池来完成这个操作,线程池内部一般是有一个阻塞队列,在并发高的时候,锁竞争就出现了:
经过查阅资料,发现Java其实有一种无锁队列的思想,其实也不是真正的无锁,只是这个锁在底层是基于操作系统的CAS实现的,对业务方来说相当于是无锁了。
本文基于netty版本:
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.51.Final</version>
</dependency>
disruptor版本:
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.3.2</version>
</dependency>