异步非阻塞_细说同步异步、阻塞非阻塞

同步、异步

同步、异步分别指的是一种通讯方式,当 cpu 不需要执行线程上下文切换就能完成任务,此时便认为这种通讯方式是同步的,相对的如果存在cpu 上下文切换,这种方式便是异步。

5856eaaf2d267d1c235ab07a136a5778.png

这里通过一个去食堂打饭的示例来理解什么是同步、异步

同步

假设现是上午最后一节课,由于小李上课的教室离食堂比较远,当下课之后,如果小李跑得不够快,那么到食堂之后会发现别人已经早你一步到达了,而小李又是个三好学生,又不能插队,此时小李只能悲痛欲绝的排在打饭窗口A的队伍最后一个人后面,依次等待轮到小李填写菜单然后取饭

异步

同样的场景,当小李跑到食堂之后,由于身体不好,已经气喘吁吁,此时又想找个位置休息下,又太饿,想去排队打饭。还好,窗口B 提供了这个功能,打饭的人先去取号并填写菜单,然后就可以去做其他事情,等到排的号到小李了之后,食堂阿姨会通过这个号码来呼叫你来取已经做好的饭,这时你心中一喜,这不就是我现在需要的么,于是你拿了号及填写菜单之后,便去找个位置占着,一边等待食堂阿姨叫你来取饭,同时还可以与朋友聊聊人生

总结 可以看出,同步的方式的耗时包含了:1.排队等待 2.填写菜单 3.等待厨师做好 而异步的方式则可以直接填写好菜单、取个号然后交给食堂阿姨之后,便可以去做其他的事情,完全没有等待的耗时,只需要在食堂阿姨呼唤你的时候,来取饭即可。

异步通常能提高系统的吞吐量,从 Servlet 3.0 便支持通过异步的方式来处理请求,当然这并不代表它什么都好,缺点是会降低系统的一部分响应时间,而且增加了系统的复杂度,使调试困难 同步相对的便是,编程简单,响应速度快,不需要对线程上下文进行切换

阻塞、非阻塞

阻塞、非阻塞指的是在同步模式下,如果当前线程一直在等待响应数据并且不能做其他事情那么认为是阻塞的,如果当前线程在等待响应数据返回的同时,又可以干其他的时,那么则是非阻塞的

9231cfcf5574bf4fb067a498ac2f8dec.png

同样的,这里再次使用食堂打饭的场景

阻塞

当小徐到食堂时,已经有许多人在排队打饭了,这时小徐无奈之下,选择了离她最近的窗口A排队打饭,然后等待的时间总是漫长的,这时她百般无聊下,想拿出她的手机准备消磨下时间,结果她突然想起手机还在教室!虽然站在这里排队打饭没有手机玩,但也是不幸中的万幸了,总算手机没丢

非阻塞 第二次,小徐再次来到食堂,发现食堂新增了取号的功能,但是只能取号,不能填写菜单,最终还是选择了这家取号的窗口B,等着叫号然后写菜单就可以了,小徐兴高采烈的玩起了手机,刷起了简书

总结

当你排队在窗口A的时候,此时不能做其他任何事情,只能等着队伍到自己这,然后填写菜单,最后等待取饭,此时在整个排队的周期内都不能干其他事情 而在窗口B则可以通过取号的方式,让你不需要时刻的去站着排队,而是可以去刷刷简书、打打游戏

JDK中的BIO 对应的就是阻塞IO,NIO 对应的是非阻塞IO,通过非阻塞IO,可以让一个线程处理成千上万的并发请求


作者:coding400
链接:https://www.jianshu.com/p/69e90f9bbd7c
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332879.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何将网页部署到maven_如何通过Rultor将Maven工件部署到CloudRepo

如何将网页部署到maven在我以前的文章中 ,我描述了如何在Amazon S3中设置私有Maven存储库并通过Rultor进行部署。 如果您熟悉管理Amazon Web Services(AWS), S3和AWS Identity and Access Management(IAM)的…

macOS下如何使用命令启动数据库/停止数据库/重启数据库(MySQL)

文章目录启动数据库手动启动数据库自启动数据库查看数据库服务是否启动重启数据库服务停止数据库服务注意使用 sudo 执行命令会报错,所以不要使用 sudo: sudo mysql.server start . ERROR! The server quit without updating PID file (/usr/local/var/…

table 多行 宽度不一致_layui table 中固定列的行高和table行高不一致

Pipe(点积叉积的应用POJ1039)Pipe Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9723 Accepted: 2964 Description ...cocos2d-x之CCMotionStreak类——2013-08-25 16在游戏的实现过程中,有时会需要…

java rest框架_比较Java REST文档框架

java rest框架决定在记录REST API时选择哪种Java框架可能很麻烦。 在本博文中,我们将简要比较我们自己使用的REST Web服务的三个文档框架,以及它们如何与Spring框架(这是Foreach中最常用的Java框架)集成。 这些是RESTful API建模语…

数据库的事务学习

文章目录事务四大特征多事务并发存在的问题事务隔离级别查询数据库的隔离级别设置数据库隔离级别1.事务里面的语句出错时并不会主动回滚,需要用户主动执行回滚指令 2.事务开始后,如果没有主动执行回滚或者提交指令,事务始终在执行中 3.事务执…

注解动态赋值_Java注解是如何玩转的,面试官和我聊了半个小时

作者:wind瑞 来自:JavaQ面试官:自定义的Java注解是如何生效的? 小白:自定义注解后,需要定义这个注解的注解解析及处理器,在这个注解解析及处理器的内部,通过反射使用Class、Method、…

阿里云服务器如何创建快照备份数据

文章目录创建快照快照收费你申请了阿里云服务器,其实就是申请了一个云盘,这个云盘安装了操作系统,你可以远程访问这个系统并使用该系统。我们可以给云盘创建快照,从而达到备份服务器数据的目的。创建快照 快照收费 如果您计划不再…

shebang_Java 11:运行单文件程序和“ shebang”脚本

shebang在Java 11中,对java启动器进行了增强,可以直接运行单文件源代码程序,而不必先编译它们。 例如,考虑以下仅添加其参数的类: import java.util.*; public class Add {public static void main(String[] args) {…

iShot快捷键

快捷键说明Option A选择截图区域Option Z截图光标下的窗口Option X截图整个屏幕Option D延时截图Option W开始录屏/结束录屏

日期格式化为yyyymmdd_Excel小技巧——如何将多行日期快速转换为数字文本

Hello~大家好,本来计划这一期给大家介绍一下如何根据身份证号快速获得性别信息的小技巧,但是在上一节内容如何将数字快速转换成日期格式发布后,就有朋友私信问我,可不可以再介绍一下将日期快速转换成数字文本的方法呢?…

顽皮狗 多线程分享_谁去过顽皮,谁去过尼斯? 圣诞老人为您提供Java 11建议!...

顽皮狗 多线程分享有没有想过圣诞老人如何为世界各地的孩子们提供节日礼物? 有20亿个孩子,每个孩子都有自己的愿望清单,他会在24小时内完成。 这意味着平均每个孩子43微秒,他需要检查每个孩子是否顽皮或好。 您无需再怀疑了。 我…

2021新交规超速处罚规定

1.时速超过限定时速不到10%的,给予警告; 2.在限速为50公里以下的道路,时速超过限定时速10%以上不到20%的(必须低于时速55公里),处50元罚款;超过限定时速20%以上不到50%的,处100元罚…

处理接口超时_架构设计|异步请求如何同步处理?

本文创意来自一次业务需求,这次需要接入一个第三方外部服务。由于这个服务只提供异步 API,为了不影响现有系统同步处理的方式,接入该外部服务时,应用对外屏蔽这种差异,内部实现异步请求同步。全文摘要:异步…

使用Spring Boot和MongoDB构建一个React式应用程序

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。 如果您要处理大量流数据,React式应用程序可让您更好地扩展。 它们是非阻塞…

jax-ws和jax-rs_JAX-RS和OpenAPI对Hypermedia API的支持:任重而道远

jax-ws和jax-rs或早或晚,大多数积极使用REST(ful) Web服务和API的开发人员偶然发现了这种真正的外星事物,即HATEOAS : 超文本作为应用程序状态的引擎 。 对HATEOAS是什么及其与REST的关系的好奇最终将导致发现Richards…

如何下载MySQL的JDBC驱动包

1.打开 MySQL 官网:https://www.mysql.com/ 2.点击 DOWNLOADS,把页面滚动到最下面,点击 MySQL Community (GPL) Downloads 3.点击 Connector/J 4.点击 General Availability(GA) Releases,在 Select Operating System 下拉列表选…

IntelliJ IDEA for Mac如何添加jar包/如何导入jar包/导包

文章目录如何将 jar 包添加到已存在的资源库中将 jar 包添加到项目级别的资源库中将 jar 包添加到全局级别的资源库中将 jar 包添加到模块级别的资源库中创建资源库创建模块级别的资源库创建项目级别的资源库创建全局级别的资源库给某个模块单独添加 jar 包模块的依赖标签页&am…

r2dbc_使用Spring Data R2DBC进行异步RDBMS访问

r2dbc不久之前,发布了JDBC驱动程序的React性变体。 称为R2DBC。 它允许将数据异步流传输到已预订的任何端点。 通过将R2DBC之类的React性驱动程序与Spring WebFlux结合使用,可以编写一个完整的应用程序,以异步方式处理数据的接收和发送。 在本…

python中布尔类型是特殊的_Python中的特殊方法以及应用详解

前言Python 中的特殊方法主要是为了被解释器调用的,因此应该尽量使用 len(my_object) 而不是 my_object.__len__() 这种写法。在执行 len(my_object) 时,Python 解释器会自行调用 my_object 中实现的 __len__ 方法。除非有大量的元编程存在,直…

IntelliJ IDEA 自动补全变量名称和变量类型(自动补全变量的声明内容)

文章目录varOption EnterOption Command Vvar // 如下声明定义一个字符串变量 String s new String(); // 1 先编写 new String() // 2 在 new String() 后面输入 .var 直接回车,即可得到我们想要的变量了 // 3 上面生成的变量名可能不是我们想要的&#xff0c…