简述JAVA同步、异步、阻塞和非阻塞之间的区别

 更新时间:2020年08月01日 11:41:26   转载 作者:PinXiong  
这篇文章主要介绍了JAVA同步、异步、阻塞和非阻塞之间的区别,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下

同步和异步,阻塞和非阻塞是大家经常会听到的概念,但是它们是从不同维度来描述一件事情,常常很容易混为一谈。

1. 同步和异步

同步和异步描述的是消息通信的机制。

同步

当一个request发送出去以后,会得到一个response,这整个过程就是一个同步调用的过程。哪怕response为空,或者response的返回特别快,但是针对这一次请求而言就是一个同步的调用。

异步

当一个request发送出去以后,没有得到想要的response,而是通过后面的callback、状态或者通知的方式获得结果。可以这么理解,对于异步请求分两步:

1)调用方发送request没有返回对应的response(可能是一个空的response);

2)服务提供方将response处理完成以后通过callback的方式通知调用方。

对于1)而言是同步操作(调用方请求服务方),对于2)而言也是同步操作(服务方回掉调用方)。从请求的目的(调用方发送一个request,希望获得对应的response)来看,这两个步骤拆分开来没有任何意义,需要结合起来看,而这整个过程就是一次异步请求。异步请求有一个最典型的特点:需要callback、状态或者通知的方式来告知调用方结果。

2. 阻塞和非阻塞

阻塞和非阻塞描述的是程序在等待调用结果(消息,返回值)时的状态。

阻塞

阻塞调用是指调用方发出request的线程因为某种原因(如:等待系统资源)被服务方挂起,当服务方得到response后就唤醒挂起线程,并将response返回给调用方。

非阻塞

非阻塞调用是指调用方发出request的线程在没有等到结果时不会被挂起,直到得到response后才返回。

阻塞和非阻塞最大的区别就是看调用方线程是否会被挂起。

3. 同步、异步、阻塞和非阻塞IO

同步阻塞IO

针对Sender而言,请求发送出去以后,一直等到Receiver有结果了才返回,这是同步。在Sender获取结果的期间一直被block住了,也就是在此期间Sender不能处理其它事情,这是阻塞。

异步阻塞IO

针对Sender而言,请求发送出去以后,立刻返回,然后再等待Receiver的callback,最后再次请求获取response,这整个过程是异步。在Sender等待Receiver的callback期间一直被block住了,也就是在此期间Sender不能处理其它事情,这是阻塞。

同步非阻塞IO

针对Sender而言,请求发送出去以后,立刻返回,然后再不停的发送请求,直到Receiver处理好结果后,最后一次发请求给Receiver才获得response。Sender一直在主动轮询,每一个请求都是同步的,整个过程也是同步的。在Sender等待Receiver的response期间一直是可以处理其它事情的(比如:可以发送请求询问结果),这是非阻塞。

异步非阻塞IO

针对Sender而言,请求发送出去以后,立刻返回,然后再等待Receiver的callback,最后再次请求获取response,这整个过程是异步。在Sender等待Receiver的callback期间一直是可以处理其它事情的,这是非阻塞。

总结

  • 同步和异步就看调用方是否需要通过callback、通知或者状态来获取结果
  • 阻塞和非阻塞就看调用方在发送请求后是否block住了

以上就是简述JAVA同步、异步、阻塞和非阻塞之间的区别的详细内容,更多关于JAVA同步、异步、阻塞和非阻塞的区别的资料请关注脚本之家其它相关文章!

相关文章

  • java实现301跳转和重定向的方法

    java实现301跳转和重定向的方法

    301跳转和重定向是做项目的时候经常需要用到的,本文给大家分享的是在java中301跳转和重定向的方法,需要的小伙伴参考下吧。
    2015-03-03
  • 如何区分JAVA中的throws和throw

    如何区分JAVA中的throws和throw

    这篇文章主要介绍了如何区分JAVA中的throws和throw,文中讲解十分详细,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • Java 发送http请求上传文件功能实例

    Java 发送http请求上传文件功能实例

    本文通过实例代码给大家介绍了Java 发送http请求上传文件功能,需要的朋友参考下吧
    2017-06-06
  • 基于eclipse.ini内存设置的问题详解

    基于eclipse.ini内存设置的问题详解

    本篇文章是对eclipse.ini内存设置的问题进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Cors实现java后端完全跨域实例

    Cors实现java后端完全跨域实例

    本篇文章主要介绍了Cors实现java后端完全跨域实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Java反射如何有效的修改final属性值详解

    Java反射如何有效的修改final属性值详解

    最近在工作中遇到一个需求,要利用反射对修饰符为final的成员变量进行修改,所以这篇文章主要给大家介绍了关于Java反射如何有效的修改final属性值的相关资料,文中通过示例代码介绍的非常详细,对需要的朋友可以参考下。
    2017-08-08
  • 通过实例解析传统jar包引用方式

    通过实例解析传统jar包引用方式

    这篇文章主要介绍了通过实例解析传统jar包引用方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • java ZXing生成二维码及条码实例分享

    java ZXing生成二维码及条码实例分享

    本文分享了java ZXing生成二维码及条码的实例代码,具有很好的参考价值,需要的朋友一起来看下吧
    2016-12-12
  • Jedis操作Redis数据库的方法

    Jedis操作Redis数据库的方法

    这篇文章主要为大家详细介绍了Jedis操作Redis数据库的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • SpringBoot获取ApplicationContext的3种方式

    SpringBoot获取ApplicationContext的3种方式

    这篇文章主要为大家详细介绍了SpringBoot获取ApplicationContext的3种方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09

最新评论