0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

详解同步异步和阻塞非阻塞

汽车玩家 来源:简书 作者:coding400 2020-05-03 17:53 次阅读

同步、异步

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

详解同步异步和阻塞非阻塞

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

同步

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

异步

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

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

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

阻塞、非阻塞

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

详解同步异步和阻塞非阻塞

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

阻塞

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

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

总结

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

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10446

    浏览量

    206572
  • 阻塞
    +关注

    关注

    0

    文章

    24

    浏览量

    8038
收藏 人收藏

    评论

    相关推荐

    verilog同步异步的区别 verilog阻塞赋值和非阻塞赋值的区别

    Verilog是一种硬件描述语言,用于设计和模拟数字电路。在Verilog中,同步异步是用来描述数据传输和信号处理的两种不同方式,而阻塞赋值和非阻塞赋值是两种不同的赋值方式。本文将详
    的头像 发表于 02-22 15:33 377次阅读

    阻塞态可以直接到运行态吗

    阻塞态即是指进程或线程在等待某种事件或资源时暂时停止执行的状态。在计算机系统中,由于各种原因,进程或线程可能会进入阻塞态,等待着能够继续执行的条件成熟。 在绝大多数情况下,阻塞态到运行态并不是直接
    的头像 发表于 11-17 11:43 1040次阅读

    阻塞的的connect()函数如何编写

    由于网络编程涉及很多细节和技巧,一直想写篇文章来总结下这方面的心得与经验,希望对来者有一点帮助,那就善莫大焉了。 一、非阻塞的的connect()函数如何编写 我们知道用connect()函数默认
    的头像 发表于 11-11 16:23 627次阅读
    非<b class='flag-5'>阻塞</b>的的connect()函数如何编写

    安全模块的串口收发,想实现阻塞要怎么操作?

    改成阻塞的收发,需要修改那些地方呢?
    发表于 10-28 06:58

    STM32怎么实现一个阻塞性的串口屏收发?

    STM32怎么实现一个阻塞性的串口屏收发
    发表于 10-24 08:15

    什么是阻塞?怎么设计才能满足阻塞指标?

    阻塞就是外部有阻塞干扰信号的时候,设备还可以正常运行。一般分为带内阻塞和带外阻塞,由于直放站都是做宽带设备,一般只提带外阻塞
    的头像 发表于 10-10 11:22 668次阅读

    网络IO模型:阻塞与非阻塞

    阻塞 IO 模型 在Linux ,默认情况下所有的 socket 都是阻塞的,一个典型的读操作流程如图所示。 阻塞和非阻塞的概念描述的是用户线程调用内核 IO 操作的方式:
    的头像 发表于 10-08 17:16 486次阅读
    网络IO模型:<b class='flag-5'>阻塞</b>与非<b class='flag-5'>阻塞</b>

    阻塞赋值与非阻塞赋值

    ”=“阻塞赋值与”
    的头像 发表于 09-12 09:06 651次阅读
    <b class='flag-5'>阻塞</b>赋值与非<b class='flag-5'>阻塞</b>赋值

    FutureTask是如何通过阻塞来获取到异步线程执行结果的呢?

    Future 对象大家都不陌生,是 JDK1.5 提供的接口,是用来以阻塞的方式获取线程异步执行完的结果。
    的头像 发表于 08-12 14:37 509次阅读

    在verilog语句中,阻塞赋值和小于等于均使用符号“<=”,如何区分<=所表示的含义?

    )中,\"<=\"作为阻塞赋值的一部分。 verilog中,一个语法结构不可能同时允许“表达式”和“语句”, 如果某处可以出现表达式,那么就不允许出现语句; 如果
    发表于 08-08 09:32

    一文了解阻塞赋值与非阻塞赋值

    今天给大家普及一下阻塞赋值和非阻塞赋值的相关知识
    的头像 发表于 07-07 14:15 1463次阅读
    一文了解<b class='flag-5'>阻塞</b>赋值与非<b class='flag-5'>阻塞</b>赋值

    阻塞与非阻塞通信的区别 阻塞和非阻塞应用场景

    阻塞通信(Blocking Communication):当进行阻塞通信时,调用者在发起一个I/O操作后会被阻塞,直到该操作完成返回才能继续执行后续代码。
    的头像 发表于 06-15 17:32 4125次阅读

    Linux驱动学习笔记:阻塞/非阻塞IO

    在应用程序中,使用open函数打开一个`/dev`目录下的一个设备文件时,默认是以阻塞的方式打开。
    发表于 06-12 16:22 417次阅读
    Linux驱动学习笔记:<b class='flag-5'>阻塞</b>/非<b class='flag-5'>阻塞</b>IO

    Verilog中阻塞和非阻塞赋值金规

    对于VerilogHDL语言中,经常在always模块中,面临两种赋值方式:阻塞赋值和非阻塞赋值。对于初学者,往往非常迷惑这两种赋值方式的用法,本章节主要介绍这两种文章的用法。其实,有时候概念稍微不清楚,Bug就会找到我们,下面一文扫清
    的头像 发表于 06-01 09:21 573次阅读

    如何使用中断的快速/阻塞SPI?

    我正在寻找一种几乎连续发送 SPI 数据而不阻塞 CPU 的方法。我通常使用 PlatformIO / Arduino SDK 进行开发,其 SPI 类仅支持 SPI 的阻塞写入。我在 RTOS
    发表于 05-29 08:01