BIO(同步阻塞):Socket编程就是 BIO ,操作时会阻塞线程,并发处理能力低 。阻塞的原因在于:操作系统允许的线程数量是有限的,多个socket申请与服务端建立连接时,服务端不能提供相应数量的处理线程,没有分配到处理线程的连接就会阻塞等待或被拒绝。
NIO(同步非阻塞):是对BIO的改进 ,基于Reactor模型 。bio在传输数据时大部分时间这个“ 数据通道”是空闲的,但还是占用着线程。NIO改进的就是“一个请求一个线程”,在连接到服务端的众多 socket中,只有需要进行 IO操作的才能获取服务端的处理线程进行 IO 。这样就不会因为线程不够用而限制了socket的接入。
AIO(异步非阻塞):这种 IO模型 是由操作系统先完成了客户端请求处理再通知服务器去启动线程进行处理 。 AIO也称 NIO2.0 , 在 JDK7开始支持 。
阻塞与非阻塞:主要指的是访问 IO 的线程是否会阻塞(或者说是等待)
阻 塞:请求资源时,线程只有等到资源就绪之后才去做其他事情
非阻塞:请求资源时,资源没准备好就先去做其他事情,过一会又来访问,直到资源准备好为止
同步和异步:主要是指的数据的请求方式,同步和异步是指访问数据的一种机制
同 步:请求资源时,直到资源准备就绪获取到结果之后才返回
异 步:请求资源后,不会等待先去做其他事情,资源处理完之后,主动通知线程来获取结果