BIO、NIO与AIO的区别

IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。

    同步思想:就是当程序处理完一个请求或者操作的时候,再返回给用户。用户等待时间长,且不能关闭该程序或者这个页面,必须等                   待该请求运行完,才能关闭或者其他操作,用户体验差。

    异步思想:就是当程序发出一个请求后,响应给用户,该请求已受理,你可以关闭或者操作其他事情,等处理完后再告诉用户,此次                   操作已完成。

    阻塞思想:当一个线程在执行该操作时,如果有其他请求执行一样的操作,那么后来的请求就保持等待状态,直到上一个线程执行完                     该操作后,才开始执行。

    非阻塞思想:当一个线程在执行该操作时,如果有其他请求执行一样的操作,那么该线程无需等待,直接执行该操作

经典故事案例:

  • 人物:老张
  • 道具:普通水壶(水烧开不响);响水壶(水烧开发出响声)
  • 案例:
                       1、同步阻塞:
                             老张在厨房用普通水壶烧水,一直在厨房等着(阻塞),盯到水烧开(同步);
                       2、异步阻塞:
                             老张在厨房用响水壶烧水,一直在厨房中等着(阻塞),直到水壶发出响声(异步),老张知道水烧开了;
                       3、同步非阻塞:
                             老张在厨房用普通水壶烧水,在烧水过程中,就到客厅去看电视(非阻塞),然后时不时去厨房看看水烧开了没                                                      (轮询检查同步结果);
                       4、异步非阻塞:
                             老张在厨房用响水壶烧水,在烧水过程中,就到客厅去看电视(非阻塞),当水壶发出响声(异步),老张就知道                                                  水烧开了。

    BIO: 

        同步阻塞 IO

                在JDK1.4以前只要是网络IO操作,唯一的选择就是使用BIO(同步阻塞),当一个线程处理客户端的请求后,如果有其他客户端请求过来,只能等待,直到上一个线程处理完请求后,才会处理该客户端请求(单线程)。当然,也可以使用线程池来弥补该不足。但是线程的开启是有限制的,不同的操作系统对线程开启的数量都有不同的限制,如果线程数过多,操作系统会无法承担如此数量的线程使用,会导致服务器拒接客户端的请求。最终结果是导致服务器崩溃。因为线程的开销是很大的。同理,BIO不适合应用在高并发的场景中。

    NIO:

        同步非阻塞 IO

                 在JDK1.4之后,支持NIO,在BIO中一个请求对应一个线程,但是NIO在此基础上进行改善,其思想是当一个请求过来,会有一个类似管家的角色,该管家会不断轮询,如果有请求过来,会通知一个或者多个线程来处理,会有一个或多个线程专门来处理该请求,如果当前没有请求,该线程就可以处理其他的操作,而无需等待客户端的请求。NIO适用于多且短连接的场景,比如聊天室。

    AIO:

        异步非阻塞 IO

                 在JDK1.7以后,支持AIO 在NIO的基础上再进化,当IO请求过来时程序会响应该请求,但是具体的读写操作,交给操作系统来完成,当操作系统处理完后,通知该程序,此操作已处理完,再有该程序接管。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值