(tomcat)当启用nio的时候,却配置serverSocketChannel.blocking=true?

最近在观察tomcat源码。发现了这么一个现象:

如上是当tomcat启用nio的connector的时候,会创建NioEndpoint去处理底层socket连接,在绑定操作中却发现,serverSocket配置的是非阻塞模式,当时十分震惊,明明启用的是nio,却还要设置阻塞?

其实上述操作没什么问题,考虑我们为什么使用nio,而放弃bio.因为bio的accept是个阻塞方法,而且write和read操作也是阻塞的。因此我们只能当新连接到来时去创建新线程出处理这个连接,这样带来的最大问题是不能同时处理大量连接,因为大量连接带来的是创建很多线程,线程成本很高,大量线程很容易让操作系统崩溃,而且虽然并发度很高,但是很多线程都在空转,很多时间都浪费在线程空跑和线程切换上,效率很差。

因为这样的原因催生了nio.

经典nio变成如下:

https://www.cnblogs.com/zhuawang/p/3843723.html

但事实上,处理连接的操作不必放在后台线程中,因为后台线程很可能会处理连接建立不及时,不如将其置于主线程中,增加并发度(虽然优势并不是十分明显)。我们需要重点关心的是连接建立后获得的与客户端交互的那个socket,他的操作必须是非阻塞的,这很显然。因为在处理长连接的时候,我们往往关心的是在本次连接之内数据的读写。

tomcat在接收到socket的时候做了如下操作:

因此tomcat的这种处理方式还是不错的。当然将server socket接收连接设置为非阻塞也是可以的,但是没有必要。

辅助解答:

https://stackoverflow.com/questions/23168910/why-tomcats-non-blocking-connector-is-using-a-blocking-socket

statckoverflow真是一个好东西,善用能使效率提高很大

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值