BIO:同步阻塞IO(面向流的)#
特点:一个连接建立一个线程,连接如果没有IO请求时,则会浪费线程资源开销,可以通过线程池技术来改善
适用场景:连接数小,并发数小,架构固定(java1.4之前唯一的IO)
NIO:同步非阻塞(面向Buffer的)#
特点:客户的发送的连接请求会注册到多路复用器上,多路复用器轮询到连接存在有效请求时才会启动一个线程来进行处理
适用场景:连接数目多,且连接比较短的架构,比如聊天服务器(java1.4开始支持)
AIO:异步非阻塞#
特点:针对客户端连接发出的IO请求,会由OS先完成IO操作后,在通知服务器启动线程进行处理
适用场景:连接数目多,连接比较长,比如相册服务器,充分调用OS参与并发操作(java1.7开始支持)
同步、异步(关注点:消息通信机制、IO请求发送)#
同步:发送一个请求后,会不断的去轮询、等待请求结果返回后再发送下一个请求,可以避免死锁,脏读的发生
异步:发送一个请求后,不需要等待结果返回也可以发送下一个请求,可以提高效率,保证并发,OS执行完成后会通过回调函数通知应用程序获取结果
阻塞、非阻塞(关注点:程序在等待调用结果时的状态、IO操作结果获取)#
阻塞:程序在等待请求结果的时候,线程会被挂起,调用线程只有在得到结果之后才会返回
非阻塞:虽然不能立马得到结果,但是该调用不会阻塞当前线程,此线程还可以干其他事
NIO IO多路复用#
NIO是概念,IO多路复用是一套方案
当某个连接发送请求到服务器,服务器把这个连接请求当作一个请求“事件”,并把这个“事件”分配给相应的函数处理。我们可以把这个处理函数放到线程中去执行,执行完就把线程归还,这样一个线程就可以异步的处理多个线程
而阻塞式 I/O 的线程的大部分时间都被浪费在等待请求上了
对于同步非阻塞,一个线程可以执行多个连接中的请求,而同步阻塞则时一个线程对应一个连接,所以阻塞会很严重, 线程浪费严重