【Java基础】BIO/NIO/AIO的详细介绍与比较区分

这篇具有很好参考价值的文章主要介绍了【Java基础】BIO/NIO/AIO的详细介绍与比较区分。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 基本概念

1.1 BIO

BIO 全称 Blocking I/O,它是 JDK 1.4 之前的传统IO模型,是一种同步阻塞的IO,线程发起 IO 后,一直阻塞,直到缓冲区数据就绪后,在进入下一步操作

  • BIO存在的问题:
    • 无法应对高并发的场景
    • 连接建立后,当前线程没有数据可读就会阻塞,造成资源浪费
  • BIO适用场景:
    • 客户端连接数少
    • 并发量不高

1.2 NIO

NIO 全称 Non-Blocking I/O,也有人称之为 New /0,它是JDK 1.4 中引入的一种同步非阻塞的 I/O 模型。线程发起IO后、用户线程不需要一直等待IO缓冲区,期间可以做其他操作,只需要轮询检查IO缓冲区数据是否就绪即可。

  • NIO是基于Reactor反应堆模式实现的,分为三步:
    • 注册感兴趣的事件
    • 扫描是否有感兴趣的事情发生
    • 事件发生后做出相应的处理
  • NIO的三大核心组件
    • Channel通道:应用程序和操作系统交互事件、传递数据的通道,Channel是基于Buffer缓冲区异步的双向的数据读写通道,即可以从Buffer中读取数据,也可以向Buffer中写入数据。所有被Selector注册的通道,都只能是继承了SelectableChannel类的子类,类型有:
      • FileChannel:本地文件的读取、写入、映射和操作的通道
      • DatagramChannel:实现发送和接收UDP协议数据包的通道
      • SocketChannel:应用服务程序的监听通道,被Channel包装的ServerSocket
      • ServerSocketChannel:TCP Socket的监听通道,被Channel包装的Socket
    • Buffer缓冲区: Buffer 缓冲区,主要用于和 Channel 进行交互。以写为例,应用程序先将数据写入缓冲区,再通过通道把缓冲区的数据发送出去;读也是一样,数据先从通道读到缓冲区,应用程序再读取缓冲区的数据。Buffer 缓冲区本质上是一个字节数组,Buffer 读写数据一般遵循如下步骤:
      1. 写数据到 Buffer 缓冲;
      2. 调用 flip()方法将 Buffer 从写模式切换到读模式
      3. 从Buffer 中读取数据
      4. 调用 clear()方法或者 compact() 方法清理数据,准备下一次的写入

类型有:ByteBuffer,CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer,LongBuffer,ShortBuffer; 此外还有 MappedByteBuffer,HeapByteBuffer,DirectByteBuffer 等。

  • **Selector选择器或者多路复用器:**要实现 Selector 管理 Channel,首先需要将 Channel 及其关注的事件注册在Selector 上,Selector 会不断轮询出就绪状态的 Channel 关注的事件集合,进而做相应的业务处理。通常情况下,一个线程会开启一个 Selector,而一个 Selector 可以管理多个 Channel,也就是说,一个线程就可以管理多个网络连接,即所谓的多路复用。
  • NIO适用场景:
    • 客户端连接数较多
    • 连接时间较短

1.3 AIO

AIO 全称 Asynchronous I/O,它是一种 JDK 1.7 开始支持异步非阻塞的 /0 模型。线程发起 0 请求后,不需要阻塞,立即返回异步IO操作完成后会回调通知调用方。但是,很遗憾的是,现在的IO模型使用最多的仍然是 NIO,原因很简单:Linux 系统上Java AlO 和 NIO 的底层都是基于 epoll 实现的,性能上 AIO 相比较 NIO 并没有得到很大的提升,另外,AIO 采用了异步回调、编程方式上比 NIO 要更复杂!

3 BIO/NIO/AIO的使用场景区分

使用场景如下:

  • BIO适用于连接数较少的场景
  • NIO适用于连接数目多且连接时间较短的架构,比如聊天服务器·
  • AIO适用于连接数目多且连接时间较长的架构,比如相册服务器

2 BIO和NIO的区别

BIO和NIO最大的区别并不是NIO比BIO执行速度快,而是NIO可以单个线程处理更多的连接

  • 面向流和面向缓冲区
    • Java BlO 是面向流的。每次从流中读取一个或多个字节,直至读取所有字节,它没有被缓存在任何地方,而且不能前后移动流中的数据
    • Java NIO 是面向缓冲区的。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动,这就增加了处理过程中0的灵活性
  • 阻塞I/O和非阻塞I/O
    • Java BIO 是基于传统的I/O模型的,当一个线程调用 read()或 write()时,该线程就会被阻塞,直到有一些数据被读取,或数据完全被写入,期间不做任何事情

Java NIO 采用的是非阻塞模式,当一个线程向某通道发送请求读取数据时,它仅能读取到目前可用的数据,如果目前没有数据可读,该线程并不会保持阻塞,而是在数据变可读之前,它可以继续处理其他事情。 非阻塞写也是如此,当一个线程请求写数据到某通道时,不需要等待它完全写入,该线程可以同时去处理其他事情

  • 客户端连接盒服务端线程的对应关系
    • Java BIO:一个连接一个线程,客户端有连接请求时服务器就启动一个线程进行处理

【Java基础】BIO/NIO/AIO的详细介绍与比较区分,java,java,nio,开发语言

  • Java NIO:一个线程可以处理多个连接请求,客户段发送的请求会注册到多路复用器上,多路复用器轮询到连接有I/O请求就会进行处理

【Java基础】BIO/NIO/AIO的详细介绍与比较区分,java,java,nio,开发语言文章来源地址https://www.toymoban.com/news/detail-806782.html

到了这里,关于【Java基础】BIO/NIO/AIO的详细介绍与比较区分的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JAVA中三种I/O框架——BIO、NIO、AIO

    BIO,同步阻塞IO模型,应用程序发起系统调用后会一直等待数据的请求,直至内核从磁盘获取到数据并拷贝到用户空间; 在一般的场景中,多线程模型下的BIO是成本较低、收益较高的方式。但是,如果在高并发的场景下,过多的创建线程,会严重占据系统资源,降低系统对外

    2024年02月08日
    浏览(41)
  • Java中的三种I/O模型:BIO、NIO和AIO

    I/O(输入/输出)操作是任何应用程序中必不可少的一部分,它涉及到与文件、网络或其他设备之间的数据传输。Java提供了几种不同的I/O模型,其中最常见的是AIO(异步非阻塞I/O)、BIO(阻塞I/O)和NIO(非阻塞I/O)。这些模型在处理I/O操作时具有不同的工作方式、特性和适用

    2024年02月08日
    浏览(29)
  • BIO、NIO、IO多路复用模型详细介绍&Java NIO 网络编程

    上文介绍了网络编程的基础知识,并基于 Java 编写了 BIO 的网络编程。我们知道 BIO 模型是存在巨大问题的,比如 C10K 问题,其本质就是因其阻塞原因,导致如果想要承受更多的请求就必须有足够多的线程,但是足够多的线程会带来内存占用问题、CPU上下文切换带来的性能问题

    2024年02月14日
    浏览(34)
  • BIO、NIO和AIO

    目录 一.引言 何为IO IO的过程 Java的3种网络IO模型 阻塞和非阻塞IO IO多路复用 异步和同步IO 二.BIO 三.NIO 1. 三大组件 Channel Buffer Selector 2.ByteBuffer 2.1ByteBuffer的使用 2.2ByteBuffer 结构 ​2.3ByteBuffer的常用方法 分配空间   向 buffer 写入数据 从 buffer 读取数据 字符串与 ByteBuffer 互转 分

    2024年02月12日
    浏览(24)
  • BIO、NIO、AIO 的区别

    Java面试题  阻塞IO。一个连接一个线程,当服务端接受到多个客户端的请求时,客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销 同步非阻塞IO 。一个线程处理多个连接。NIO 包含  Channel(通道)、Selector(选择

    2024年01月20日
    浏览(24)
  • BIO、NIO、AIO区别详解

    主线程发起io请求后,需要等待当前io操作完成,才能继续执行。 引入selector、channel、等概念,当主线程发起io请求后,轮询的查看系统是否准备好执行io操作,没有准备好则主线程不会阻塞会继续执行,准备好主线程会阻塞等待io操作完成。 主线程发起io请求后,不会阻塞,

    2024年02月07日
    浏览(33)
  • BIO、NIO、AIO 有什么区别?

    Java 中的I/O模型主要分为三类:BIO(Blocking I/O)、NIO(New I/O)和AIO(Asynchronous I/O)。它们在处理I/O操作时有着不同的工作方式和特点。 BIO是传统的I/O模型,也称为同步I/O。在BIO中,每个I/O操作都会阻塞线程,直到数据准备好或者操作完成。这意味着一个线程只能处理一个连

    2024年01月16日
    浏览(26)
  • BIO、NIO、AIO 有什么区别

    在Java中,BIO(Blocking I/O)、NIO(Non-blocking I/O)和AIO(Asynchronous I/O)都是用于处理I/O(输入/输出)操作的不同方式。它们在处理I/O时具有不同的特点和适用场景。 BIO(Blocking I/O): 阻塞式I/O模型,是Java最传统的I/O模型。 在BIO中,每个I/O操作都会阻塞当前线程,直到操作完

    2024年02月13日
    浏览(26)
  • 代码分析Java中的BIO与NIO

    OS:Win10(需要开启telnet服务,或使用第三方远程工具) Java版本:8 BIO(Block IO),即同步阻塞IO,特点为当客户端发起请求后,在服务端未处理完该请求之前,客户端将一直等待服务端的响应。而服务端在此时也专注于该请求的处理,无法处理其它客户端的请求。 在IDEA运行上述

    2024年02月14日
    浏览(26)
  • Java网络编程-深入理解BIO、NIO

    BIO BIO 为 Blocked-IO(阻塞 IO),在 JDK1.4 之前建立网络连接时,只能使用 BIO 使用 BIO 时,服务端会对客户端的每个请求都建立一个线程进行处理,客户端向服务端发送请求后,先咨询服务端是否有线程响应,如果没有就会等待或者被拒绝 BIO 基本使用代码: 服务端: 客户端:

    2024年02月04日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包