zoukankan      html  css  js  c++  java
  • 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可以做到一个线程来处理多个操作。

  • 相关阅读:
    SecureCRT 安装及初始化配置
    企业生产环境中linux系统分区的几种方案
    Django之验证码 + session 认证
    Django之上传文件
    Django之Cookie与Session
    Django之CSRF 跨站请求伪造
    web前端之 DOM
    c++ 之 字符和字符串
    web前端
    调用线程无法访问此对象,因为另一个线程拥有该对象
  • 原文地址:https://www.cnblogs.com/cokeHuan/p/12506116.html
Copyright © 2011-2022 走看看