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

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 阻塞与非阻塞_简述JAVA同步、异步、阻塞和非阻塞之间的区别相关推荐

  1. 简述java程序的工作过程_简述 Java 程序的开发过程。_学小易找答案

    [填空题]两个啮合齿轮在啮合区内,一个齿轮的轮齿用()绘制,另一个齿轮的轮齿被遮挡的部分用()绘制,被遮挡的部分也可以省略不画. [单选题]只有建立了统一的学校集体,才能在儿童的意识中唤起舆论的强大力 ...

  2. java类如何加载_简述Java类加载方式及流程

    在学习反射那一章节时想到自己之前学过的知识,故整理一番,希望能提供一点帮助,水平有限,如若有误欢迎指正. Java提供了两种类的装载方式.一是预先加载,二是按需加载.因为可以对类进行按需加载,所以程序 ...

  3. 简述java对象的封装特点_简述Java面向对象三大特征:封装、继承、多态

    前面是一个引用类型变量后面是一个类,用于判断前面的对象是否是后面的类的实例,如果是返回true,若不是返回false,避免了ClassCastException. public interface A ...

  4. 【源码+图片素材】Java王者荣耀游戏开发_开发Java游戏项目【王者荣耀】1天搞定!!!腾讯游戏_Java课程设计_Java实战项目_Java初级项目

    王者荣耀是当下热门手游之一,小伙伴们是否想过如何制作一款属于自己的王者荣耀游戏呢? 本课程讲解了一个王者荣耀游戏的详细编写流程,即使你是刚入门Java的新手,只要你简单掌握了该游戏所需要的JavaSE ...

  5. java 多态判断非空_收藏Java 面试题全梳理

    脚本之家 你与百万开发者在一起 来源 | Java建设者(ID:javajianshe) 作者 |cxuan 如若转载请联系原公众号 Java 基础篇 Java 有哪些特点 并发性的:你可以在其中执行 ...

  6. cpu 被挂起和阻塞_迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章...

    网上有很多讲同步/异步/阻塞/非阻塞/BIO/NIO/AIO的文章,但是都没有达到我的心里预期,于是自己写一篇出来. 常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTTP接口拿到详情数 ...

  7. 简述java的异常处理机制_简述java异常处理机制

    引言: Hello,我的好朋友们,又到我们相聚的时间了,今天我要和大家分享一些有关java异常处理的相关 知识,也是通过老师的讲解和相关材料的借鉴之后的一个比较系统的总结,真心希望写完这篇文章的我和看 ...

  8. java类型转换机制_简述java类型转换机制。

    展开全部 string和int之间的转换? 字符串转换成数据 Java代码 String MyNumber ="1234"; int MyInt = Integer.parseIn ...

  9. java计分系统编程代码_使用Java代码对实时系统进行编程

    由于许多重要原因,Java语言在实时系统中的使用并不广泛. 这些包括Java语言设计固有的不确定性性能影响,例如动态类加载,以及Java Runtime Environment(JRE)本身,例如垃圾 ...

最新文章

  1. php video标签使用方法,HTML_HTML5 video标签(播放器)学习笔记(一):使用入门,近有在学习html5中video标签(播 - phpStudy...
  2. Java设计模式——桥模式
  3. matplotlib包的学习(二)
  4. 日本第一赘婿!他入赘近20年拿下诺贝尔奖,成名后不忘教光棍讨老婆......
  5. nyoj187 快速查找素数
  6. oracle脚本审核平台,Oracle 脚本(适应各种业务需要)
  7. 程序员笔记|常见的Spring异常处理
  8. WebStorm-2018.2.2配置
  9. 回调函数例子_Linux C - C基础篇八(函数)
  10. 使用POI导出数据以及性能比较
  11. linux编译 __stdcall,Linux中是否有STDCALL?
  12. OTA频发的“大数据杀熟”,想要治你不容易?
  13. coffe-script
  14. 中国人大计算机保研生源学校,中国人民大学2021届保研、拟录取总结
  15. 计算机怎么打出钱的符号,人民币符号怎么打,教您电脑怎么打人民币符号
  16. 2020年3大免费又好用的BI工具软件
  17. 超全!Tkinter 使用教程!4000字!
  18. mysql 双冒号,SQL中的双冒号(::)符号
  19. 如何将WIN10自带浏览器Microsoft Edge中的书签导出
  20. 算法笔记——15个瓶子,4只老鼠,测试哪瓶有毒

热门文章

  1. excel中offset用法
  2. 【安全的办公和生产力应用程序】上海道宁为您提供ONLYOFFICE下载、试用、教程
  3. 您的计算机屏蔽了 vac 系统,csgovac被屏蔽 CSGOVAC系统被屏蔽解决方法
  4. Linux同步时间chrony替换NTP简单好用
  5. 【Java与Python实现】最实际与高效生成数据库高级声明式SQL脚本神器研发
  6. django框架访问mysql数据库_Django框架怎么配置mysql数据库
  7. mysql默认索引_mysql的索引
  8. MySQL和DB2对比
  9. 2020年江苏中考数学能用计算机吗,重磅!江苏中考改革来了!改什么,看这里...
  10. python代码检测工具及区别_flake8-python代码质量检测工具