java - IO模型
BIO NIO AIO
同步与异步,阻塞与非阻塞
同步与异步是面向多个线程协作的情况。
假设我们设定一个场景,打电话到书店,咨询有没有 设计模式 这本书。
你好,请问有没有设计模式这本书?
我不太确定,需要去找一下,您等下我。
这时候为你和店家的行为为 同步模式,你需要拿着电话等到店家给你答复。等待店家回复的状态为阻塞状态
我不太确定,您先去忙吧,等过一段时间我给你回电话
这时候你和店家的行为为异步模式,在命令发出后,不需要等待答复,可以先做其他的事情。这个时候你的状态为非阻塞状态
BIO与NIO的区别
BIO是面向流的同步阻塞IO,每一个客户端与服务端的通讯都需要一个单独的线程,数据的读取写入必须阻塞在一个线程内等待其完成。
NIO是面向管道的同步非阻塞IO,它支持面向缓冲的基于管道的IO操作方法
-
IO流是阻塞的,NIO流是不阻塞的
NIO可以进行非阻塞的IO操作,线程在将数据从通道读取数据到buffer后就可以做其他的事情,一个线程写入一些数据到某通道,不需要等待完全写入,这个线程可以去做别的事情。 -
IO面向流,NIO面向缓冲区
Buffer是一个对象,包含要写入或者读出的数据,在面向流的IO中,可以将数据直接写入或者直接读到Stream中,而NIO是直接读到Buffer中进行操作。
-
NIO通过通道进行读写
通道是双向的,流是单向的。通道只能跟Buffer进行交互。因为通道的存在,通道可以异步的读写。
-
NIO有选择器
选择器可以通过单个线程处理多个通道,线程的切换对于操作系统来说是昂贵的,选择器提高了系统效率。
网友评论