在学习I/O之前我们先要了解两组概念
同步和异步
当你同步执行某项任务时,你需要等待其完成才能继续执行其他任务。当你异步执行某些操作时,你可以在完成另一个任务之前继续进行。
-
同步 :两个同步任务相互依赖,并且一个任务必须以依赖于另一任务的某种方式执行。 比如在
A->B
事件模型中,你需要先完成 A 才能执行B。 再换句话说,同步调用中被调用者未处理完请求之前,调用不返回,调用者会一直等待结果的返回。 -
异步: 两个异步的任务是完全独立的,一方的执行不需要等待另外一方的执行。再换句话说,异步调用中一调用就返回结果不需要等待结果返回,当结果返回的时候通过回调函数或者其他方式拿着结果再做相关事情,
阻塞和非阻塞
-
阻塞: 阻塞就是发起一个请求,调用者一直等待请求结果返回,也就是当前线程会被挂起,无法从事其他任务,只有当条件就绪才能继续。
-
非阻塞: 非阻塞就是发起一个请求,调用者不用一直等着结果返回,可以先去干其他事情。
如何区分 “同步/异步 ”和 “阻塞/非阻塞” 呢?
同步/异步是从行为角度描述事物的,而阻塞和非阻塞描述的当前事物的状态(等待调用结果时的状态)。
什么是I/O模型?
通信模式或者说通信架构
就是用什么样的通道或者说是通信模式和架构进行数据的传送和接收,这很大程度上决定了程序通信的性能。
Java模式共支持三种网络编程的I/O模型:BIO,NIO,AIO
要根据不同的业务场景和性能需求决定选择不同的I/O模型
1.Java BIO
1)同步并阻塞(传统阻塞型)
2)服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就要启动一个线程进行处理,如果这个连接啥事不做就会造成不必要的线程开销
3)适用场景:适用于连接数目比较小且固定架构,这种方式对服务器资源要求比较高,并发局限于应用中,jdk1.4执勤的唯一选择,但程序简单易理解
2.Java NIO
1)同步非阻塞
2)服务器实现模式为一个线程处理多个请求(连接),即客户端的连接请求都会注册到多路复用器上,多路复用器轮询到有I/O请求就进行处理,如果没有请求就不为它分配线程
3)适用场景:NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,弹幕系统服务间通讯等,编程比较复杂jdk1.4之后开始支持
3.Java AIO
1)异步非阻塞(又称为NIO 2.0)
2)服务器实现模式为一个有效请求获取一个线程,客户端的I/O请求都是由OS(操作系统)先完成了,再通知服务器应用去启动线程进行处理,一般使用与连接数较多且时间较长的应用。
3)适用场景:AIO方式适用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用(OS)参与并发操作,编程比较复杂,jdk7开始支持