四种IO模型

128 阅读3分钟

面试官爱问的,今天有时间来总结和深入一下💕💕💕

阻塞IO(BIO)

官方概念

是Java最传统的IO模型,也是默认的IO模型。当一个线程发起一个IO操作(如读取或写入)时,如果数据没有准备好,线程会被阻塞,直到数据准备好为止。

说人话😭:就是它这个线程发起一个IO操作的时候,如果数据没有准备好,这个线程就一直干等着😢

使用:

在Java中,阻塞IO的API主要位于java.io包中,包括InputStreamOutputStreamReaderWriter等类。这些类提供了阻塞IO操作的方法,如readwritereadLine等。

优缺点:

阻塞IO在单线程应用或者IO操作不频繁的场景中表现良好,但在需要处理大量并发IO操作时,可能会导致性能瓶颈。为了解决这个问题,Java引入了非阻塞IO、多路复用IO和异步IO等更高级的IO模型。

非阻塞IO(NIO)

官方概念:

非阻塞IO(Non-blocking IO)是Java中的一种IO模型,它允许线程在发起IO操作后立即返回,而不需要等待数据的准备或操作的完成。

说人话😭:就是这个线程在发起IO操作后直接去执行别的事情了,当I/O操作完成后,可以通过轮询或回调等机制来获取结果

使用:

非阻塞I/O在Java中通常涉及到Java NIO(New I/O)包。Java NIO 提供了对非阻塞I/O的支持,其中的关键类包括 java.nio.channels 包下的 SelectorSocketChannelServerSocketChannel

优缺点:

非阻塞I/O优点在于提高资源利用效率、可伸缩性和系统响应性,但其缺点包括引入复杂性、增加错误处理难度和降低代码可读性。

多路复用IO

这个严格来说,不应该单独讲,多路复用IO是非阻塞IO的一种,但是我不严格😜😜😜

官方概念:

多路复用I/O是一种非阻塞I/O的实现方式。多路复用(Multiplexing)指的是通过一个单一的、非阻塞的I/O操作轮询多个I/O通道,从而实现同时管理多个连接的能力。

原理:

多路复用I/O的核心思想是通过一个线程监听和处理多个通道的就绪事件,从而避免了为每个通道创建一个独立的线程的开销。

优缺点:

多路复用I/O通过在一个线程中管理多个通道,提高了高并发网络应用的性能和资源利用效率,但在编程模型上相对复杂,需谨慎处理错误和维护可读性。

异步IO

关于异步IO是不是非阻塞IO,严格来说(开始严格):不是,异步I/O是一种更高层次的I/O模型,它不仅包含了非阻塞的特性,还引入了事件驱动和回调机制

官方概念:

异步I/O(Asynchronous I/O)是一种处理I/O操作的模型,其核心思想是在发起I/O请求后,不需要等待I/O操作完成,而是允许程序继续执行其他任务。当I/O操作完成时,系统通知程序,以便进一步处理已完成的操作

优缺点

异步I/O通过允许在一个线程中管理多个I/O操作,提高了系统的并发性和资源利用效率,适用于高并发、高延迟的应用场景,但实现相对复杂。