java的同步、异步,阻塞、非阻塞的理解

经常会混淆java的同步/异步,阻塞/非阻塞这个概念,通过举例简单快速的理解同步/异步,阻塞/非阻塞知识点。

概念: 同步和异步,阻塞和非阻塞是跟数据读写IO相关的概念,简单来说可以理解为:同步和异步是跟程序任务的执行和依赖相关,同步还是异步取决于被调用对象或者方法的执行方式和返回时机,即对于被调用方法的结果,是需要程序轮询获取还是主动回调。阻塞和非阻塞是跟系统CPU执行相关,即程序在进行一个慢操作任务的时候,在这过程中是否继续去执行别的任务。

IO操作:

  1. 基于字节流读取的IO:InputStream、OutputStream
  2. 基于字符流读取的IO:Reader、writer
  3. 基于磁盘操作的IO:File
  4. 基于网络操作的IO:Socket

同步与异步: 指的是被调用对象或者方法的执行方式和返回时机。

同步: A调用B,B的处理是同步的,在处理完之前他不会通知A,只有处理完之后才会明确的通知A。

异步: A调用B,B的处理是异步的,B在接到请求后先告诉A我已经接到请求了,然后异步去处理,处理完之后通过回调等方式再通知A。


阻塞与非阻塞: 阻塞与非阻塞最大的区别是在被调用方返回结果之前的这段时间内,调用方是否一直等待。

阻塞: A调用B,A一直等着B的返回,别的事情什么也不干。

非阻塞: A调用B,A不用一直等着B的返回,先去忙别的事情了。


同步/异步和阻塞/非阻塞的区别: 同步/异步和阻塞/非阻塞指向的对象是不一样的。同步/异步指的是被调用者,阻塞/非阻塞指的是调用者。换句话说,同步/异步指的是操作IO的对象,阻塞/非阻塞指的是程序任务,阻塞/非阻塞通常的实现方式是多线程。


组合IO模型: 同步阻塞、同步非阻塞、异步非阻塞,(异步阻塞没有意义)。


举例(程序任务A调用IO对象B,把文件保存在本地):

  1. 同步阻塞:A一直等待B的结果,直到文件保存成功后再返回结果给A。此过程中A是处于一直等待的过程。
  2. 同步非阻塞:A不需要等待B的结果,开了多线程处理对象B的文件保存操作。此过程中程序会继续执行任务C,那怎样才能知道文件是否已经保存成功呢?程序可以使用轮询的方式,检查文件是否已经保存成功了。
  3. 异步非阻塞:A不需要等待B的结果,A调用B后,B会马上通知A已经收到请求了,马上处理。接着程序会继续执行任务C,文件处理完成后会通过回调的方式告诉程序已经处理成功了。

Java中的三种IO模型:
在Java语言中,一共提供了三种IO模型,分别是同步阻塞IO(BIO)、同步非阻塞IO(NIO)、异步非阻塞IO(AIO)。java中的IO模型是对系统IO模型的封装。

BIO(Blocking IO): 同步阻塞,数据的读取写入必须阻塞在一个线程内等待其完成。BIO模型通常是在JDK1.4版本之前常用的编程方式。服务器实现模式为一个客户端对应一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。BIO模式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。

NIO(Unblocking IO/New IO): 同步非阻塞,NIO模型是在JDK1.4版本引入的,NIO的最重要的地方是当一个连接创建后,不需要对应一个线程,这个连接会被注册到多路复用器上面,所以所有的连接只需要一个线程就可以搞定,当这个线程中的多路复用器进行轮询的时候,发现连接上有请求的话,才开启一个线程进行处理,也就是一个请求一个线程模式。

AIO (Asynchronous IO): 异步非阻塞,AIO模型是在JDK1.7版本引入的,异步IO是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。


原创博客,如转载请附加说明。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值