Java有哪几种IO模型?有什么区别?
要想彻底分清BIO、NIO、AIO,首先的明白同步、异步,阻塞、非阻塞的概念。
同步、异步【针对请求】和阻塞、非阻塞【针对客户端】:
在一个网络请求中,客户端(client)会发一个请求到服务端(server)。
1.客户端发了请求后,就一直等着服务端响应。客户端:阻塞;请求:同步;
2.客户端发了请求后,就去干别的事情了。时不时过来检查一下服务端是否给出了响应。客户端:非阻塞;请求:同步;
3.换成异步请求。客户端发了请求后,就坐在了椅子上,等着服务端返回响应。客户端:阻塞;请求:异步;
4.客户端发了请求后,就去干别的事情了。等到服务端给出响应后,再过来处理业务逻辑。客户端:非阻塞;请求:异步
。
BIO:同步阻塞IO
BIO:同步阻塞IO。可靠性差,吞吐量低,适用于连接比较少且比较固定的场景,JDK 1.4之前唯一的选择。
NIO:同步非阻塞IO
NIO:同步非阻塞IO。NIO解决了BIO需要线程过多,同时给服务器造成压力过大的问题。可靠性比较好,吞吐量也比较高,适用于连接比较多并且连接比较短的场景(轻操作),例如:聊天室;从JDK 1.4开始支持。这是目前使用最广的模型,Netty框架就是基于这个模型设计的。
AIO:异步非阻塞IO
AIO:异步非阻塞IO。AIO又解决了NIO模型服务端需要一直守着线程的这个问题。可靠性最好,吞吐量也是非常高的,适用于连接比较多,并且连接比较长的场景(重操作)。例如:相册服务器。从JDK 7版本开始支持。