java 简单理解 BIO、NIO、AIO编程

简单理解 BIO、NIO、AIO编程

同步与异步

同步和异步是针对应用程序与内核的交互而言的。同步指的是用户进程触发 IO操作并等待或者轮询去查看 IO操作是否就绪,而异步是指用户进程触发 IO操作以后便开始做自己的事情,而当 IO操作已经完成的时候会得到 IO完成的通知。

简而言之,同步会专注执行这一操作,而异步则只关注开头和结果,中间交由系统完成,不在关注。

阻塞与非阻塞

阻塞和非阻塞是针对进程在访问数据的时候,根据 IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作方法的实现方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入会立即返回一个状态值。

举例:阻塞类似于排队机制,在没有排到之前一直处于等待状态,不能进行其他操作。非阻塞类似于挂号,在取得资格之后可以去做其他事,直到叫到你,你也可以询问获取当前的排队状态。

BIO编程

Blocking IO: 同步阻塞的编程方式。

JDK1.4版本之前常用的编程方式。实现过程为:在服务端启动一个ServerSocket来监听网络请求,客户端启动Socket发起网络请求,默认情况下ServerSocket会创建一个线程来处理该请求,如果服务端没有线程可用,客户端会阻塞等待或遭到拒绝。

且建立好的连接,在通讯过程中,是同步的。在并发处理效率上比较低。

NIO编程

Unblocking IO: 同步非阻塞的编程方式

NIO本身是基于事件驱动思想来完成的,其主要解决掉的是BIO的大并发问题。NIO基于Reactor,当socket有流可读或可写入socket时,操作系统会相应的通知应用程序进行处理,应用再将流读取到缓冲区或者写入到操作系统。也就是说,这个时候已经不是一个连接就要对应一个处理线程了,而是有效的请求,对应一个线程,当连接没有数据时,是没有工作线程来处理的。

NIO的最重要的地方是当一个连接创建后,不需要对应一个线程,这个链接会被注册到多路复用器上,所以所有的连接只需要一个线程就可以搞定,当这个线程中的多路复用器进行轮询时,发现连接上有请求的话才会开启一个线程进行处理,也就是一个请求一个线程模式。

在NIO的处理方式中,当一个请求来的话,开启线程进行处理,可能会等待后端应用的资源(JDBC连接等),其实这个线程就被阻塞了,当并发上来的话,还是会遇到BIO一样的问题。

目前常用的NIO框架有netty

AIO编程

Asynchronous IO: 异步非阻塞的编程方式。

与NIO不同,当进行读写操作时,只需直接调用API的 read 和 write 方法即可。这两种方法均为异步的,对于读操作而言,当有流读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将 write 方法传递的流吸入完毕时,操作系统主动通知应用程序。

可以理解为:read/write 方法时异步的,完成后会主动调用回调函数,在JDK1.7中,这部分内容被称作NIO.2。主要在java.nio.channels包下增加了四个异步通道:AsynchronousSocketChannelAsynchronousFileChannelAsynchronousServerSocketChannelAsynchronousDatagramChannel

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值