Java开发基础知识之学习篇——理解NIO

高并发引发的问题

一个使用传统阻塞IO的系统,如果还是使用传统的一个请求对应一个线程的模式,一旦有高并发的大量请求,则会有如下问题的产生:

  1、线程不够用,不断的修改线程池配置,就算使用量线程池复用线程也无济于事。

  2、阻塞IO模式,会有大量的线程被阻塞,一致在等待数据,这个时候的线程被挂起,只能干等,CPU利用率低,吞吐量差。

  3、如果网络IO阻塞或者网络波动及故障等,线程阻塞的时间可能很长,整个系统也变得不可靠。

什么是NIO?

java.nio全称java non-blocking IO (new io),是指JDK1.4及以后版本里提供的新api,为所有的原始类型(Boolean类型除外)提供缓存支持的数据容器,使用它可以提供非阻塞式的高伸缩性网络。

HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,并且并发请求的数量比HTTP1.1大了好几个数据级。

IO和NIO的区别?

IO是面向流的、阻塞的,NIO则是面向块的、非阻塞的。

怎么理解IO是面向流的、阻塞的?

java1.4以前的IO模型,一个连接对应一个线程。

原始的IO是面向流的,不存在缓存的概念。Java IO 面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存到任何地方。此外,它不能前后移动流中的数据,如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓存区

java IO的各种流是阻塞的,这意味着当一个线程调用read或者write方法是,该线程被阻塞,直到有一些数据被读取,或数据完全写入,该线程在此期间就不能干任何事情了。

怎么理解NIO是面向块的、非阻塞的?

NIO是面向缓冲区的。数据读取到一个它稍后处理的缓冲器,需要时可在缓冲区中前后移动,这就增加了处理过程中的灵活性。

java NIO 的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取,而不是保持线程阻塞,所以直至数据变得可以读取之前,该线程可以继续做其他事情。非阻塞写也是类似,一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。

NIO可以做到一个线程来处理多个操作。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可乐欢丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值