精华内容
下载资源
问答
  • 主要介绍了JAVA同步异步阻塞和非阻塞之间的区别,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
  • 简单理解什么是同步阻塞/同步非阻塞,异步阻塞/异步非阻塞 举个栗子 1、你在家做饭,用普通的汤锅,米放进去,就站在锅边,傻等饭熟。——这叫同步阻塞 是不是觉得浪费了大量的时间,于是你想提高时间的利用效率。 2...

    简单理解什么是同步阻塞/同步非阻塞,异步阻塞/异步非阻塞

    声明:本篇思想非原创,系从老师处听来。因为CSDN发转载需要有原文链接,本篇没有原文链接,所以填的原创。

    举个栗子

    1、你在家做饭,用普通的汤锅,米放进去,就站在锅边,傻等饭熟。——这叫同步阻塞

    单任务按顺序执行。
    

    是不是觉得浪费了大量的时间,于是你想提高时间的利用效率。
    2、还是用普通的汤锅,米放进去,然后继续回去打游戏,过一会就来看一次。——这叫同步非阻塞

    多任务,定时查看任务执行状态。
    

    时间的利用率稍微提升了一点点,还有没有办法再提升一点呢?

    3、你去某宝淘了个电饭锅,饭熟了会自动跳闸的那种。米放进去,然后傻傻的看它怎么做饭的。——这叫异步阻塞

    单任务,自动提交任务执行状态。
    

    这有什么意义呢?完全没利用好电饭锅的优势啊
    4、这回学聪明了,米放进去,按下按钮,然后就去打游戏了,等到跳闸的时候就去吃饭 。——这叫异步非阻塞

    多任务,自动提交任务执行状态,合理分配,最大化利用资源。
    

    这样是不是聪明了很多,时间的利用率大大提升。

    相对于程序而言的 ,异步可以给你节省出更多的时间,让你去干别的事,同步只能由你自己主动去查看。
    孰优孰劣不言而喻 。
    阻塞和非阻塞,也很好理解。
    同步阻塞,顺序执行,只能傻等,效率低下 。
    同步非阻塞,稍微高明点,但是麻烦了很多,多做很多无用功。
    异步阻塞,这个等于自断一臂,没啥大意义。
    异步非阻塞,这才是异步的最佳用法。

    展开全文
  • 主要介绍了java 中同步异步阻塞和非阻塞区别详解的相关资料,需要的朋友可以参考下
  • 同步 异步 阻塞 非阻塞 区别

    万次阅读 多人点赞 2018-09-25 10:27:27
     前一段时间出去面试,被问到同步异步与阻塞、非阻塞的区别。我一时半会没有想出来,作为一个工作三年的人来说,实在很惭愧。我当时理解同步异步属于两个进程中间的协作关系,例如使用浏览器访问一个网站,需要...

    https://www.cnblogs.com/Anker/p/5965654.html

     

    1、前言

      前一段时间出去面试,被问到同步、异步与阻塞、非阻塞的区别。我一时半会没有想出来,作为一个工作三年的人来说,实在很惭愧。我当时理解同步、异步属于两个进程中间的协作关系,例如使用浏览器访问一个网站,需要多次请求服务端,才能加载完整个页面的内容。同步的操作如下:浏览器首先发送第一个请求,等待服务器回复后,再发送第二个请求,依次类推,直到所有请求完成。异步的操作如下:浏览器发送第一个请求,可以不用等待服务器返回,可以继续发送第二个请求。阻塞与非阻塞属于进程的API执行动作的方式,例如进行需要read数据,阻塞方式操作流程是:如果没有数据,则read会一直等着数据到来,才能进行后续的动作;而非阻塞则是read没有到数据后,则可以进行后续的动作,当有数据的时候再回来读取。通常linux网络API默认都是阻塞的,例如connect、send、recv等。回答后感觉自己心里没有底,底层的关系到底是什么样的,比较虚,没能深入理解。

    2、深入理解分析  

      回来以后,赶紧上网好好查查,加深学习一下。这两个概念在工作中经常用到这些,例如在linux网络IO中涉及到如下模型:

    (1)阻塞式IO

    (2)非阻塞式IO

    (3)IO多路复用

    (4)信号驱动IO

    (5)异步IO

    在知乎上面看到一些解释如下:

    截图如下:

    3、总结

      

      同步和异步针对应用程序来,关注的是程序中间的协作关系;阻塞与非阻塞更关注的是单个进程的执行状态。

    同步:执行一个操作之后,等待结果,然后才继续执行后续的操作。

    异步:执行一个操作后,可以去执行其他的操作,然后等待通知再回来执行刚才没执行完的操作。

    阻塞:进程给CPU传达一个任务之后,一直等待CPU处理完成,然后才执行后面的操作。

    非阻塞:进程给CPU传达任我后,继续处理后续的操作,隔断时间再来询问之前的操作是否完成。这样的过程其实也叫轮询。

       阻塞、非阻塞、多路IO复用,都是同步IO,异步必定是非阻塞的,所以不存在异步阻塞和异步非阻塞的说法。真正的异步IO需要CPU的深度参与。换句话说,只有用户线程在操作IO的时候根本不去考虑IO的执行全部都交给CPU去完成,而自己只等待一个完成信号的时候,才是真正的异步IO。所以,拉一个子线程去轮询、去死循环,或者使用select、poll、epool,都不是异步。

    参考网址:

    https://www.zhihu.com/question/19732473

    https://www.zhihu.com/question/27965282

    http://www.smithfox.com/?e=191

    https://zhuanlan.zhihu.com/p/21416728

    http://blog.csdn.net/dinglang_2009/article/details/50461697

    展开全文
  • 但在这当中,发现一些概念区分起来很难,比如并发和并行,同步异步阻塞和非阻塞,但是这些概念却很重要。因此在此把它总结下来。并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间...
  • 异步同步、阻塞、非阻塞的说明解释,用于深入理解。
  • NIO详解(二): BIO 浅谈 同步 异步与阻塞 非阻塞

    千次阅读 多人点赞 2018-11-07 21:19:44
    在我们了解Java NIO/BIO的网络通信之前,我们先了解一下常用的阻塞/非阻塞模型以及同步/异步的概念 一、阻塞和非阻塞 从简单的开始,我们以经典的读取文件的模型举例。(对操作系统而言,所有的输入输出设备都被...

    在我们了解Java NIO/BIO的网络通信之前,我们先了解一下常用的阻塞/非阻塞模型以及同步/异步的概念

    一、阻塞和非阻塞

    从简单的开始,我们以经典的读取文件的模型举例。(对操作系统而言,所有的输入输出设备都被抽象成文件。)在发起读取文件的请求时,应用层会调用系统内核的I/O接口。

    如果应用层调用的是阻塞型I/O,那么在调用之后,应用层即刻被挂起,一直出于等待数据返回的状态,直到系统内核从磁盘读取完数据并返回给应用层,应用层才用获得的数据进行接下来的其他操作。

    如果应用层调用的是非阻塞I/O,那么调用后,系统内核会立即返回(虽然还没有文件内容的数据),应用层并不会被挂起,它可以做其他任意它想做的操作。(至于文件内容数据如何返回给应用层,这已经超出了阻塞和非阻塞的辨别范畴。)

    这便是(脱离同步和异步来说之后)阻塞和非阻塞的区别。总结来说,是否是阻塞还是非阻塞,关注的是接口调用(发出请求)后等待数据返回时的状态。被挂起无法执行其他操作的则是阻塞型的,可以被立即「抽离」去完成其他「任务」的则是非阻塞型的。

    二、同步和异步

    阻塞和非阻塞解决了应用层等待数据返回时的状态问题,那系统内核获取到的数据到底如何返回给应用层呢?这里不同类型的操作便体现的是同步和异步的区别。

    对于同步型的调用,应用层需要自己去向系统内核问询,如果数据还未读取完毕,那此时读取文件的任务还未完成,应用层根据其阻塞和非阻塞的划分,或挂起或去做其他事情(所以同步和异步并不决定其等待数据返回时的状态);如果数据已经读取完毕,那此时系统内核将数据返回给应用层,应用层即可以用取得的数据做其他相关的事情。

    而对于异步型的调用,应用层无需主动向系统内核问询,在系统内核读取完文件数据之后,会主动通知应用层数据已经读取完毕,此时应用层即可以接收系统内核返回过来的数据,再做其他事情。

    这便是(脱离阻塞和非阻塞来说之后)同步和异步的区别。也就是说,是否是同步还是异步,关注的是任务完成时消息通知的方式。由调用方盲目主动问询的方式是同步调用,由被调用方主动通知调用方任务已完成的方式是异步调用。

    三、Java 网络通信

    3.1 基本概念

    在Java网络通信中,最基本的概念就是Socket编程了。Socket又称“套接字” 向网络发出请求或者应答网络请求。

    Socket 和ServerSocket类库位于Java.net 包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Scoket实例,操作这个实例,完成所需要的会话。对于一个网络连接来说,套接字是平等的,不因为在服务器端或者在客户端而产生不同的级别。不管是Socket还是ServerSocket他们的工作都是通过SocketImpl类及其子类完成的。

    套接字之间的连接过程可以分为四个步骤:服务器监听,客户端请求服务器,服务器确认,客户端确认,进行通信。

    1)服务器监听:是服务器套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。

    2)服务器请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描叙它要连接的服务器的套接字,指出服务器的套接字的地址和端口,然后就像服务器套接字提出连接请求。

    3)服务器连接确认:是指当服务器套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端的套接字的描述发送给客户端。

    4)客户端连接确认:一旦客户端确认了此描叙,连接就建立完成了,双方开始通信。而服务器套接字继续处于监听状态;继续接受其他网络套接字的连接请求。

    3.2 阻塞和非阻塞

    阻塞:应用程序在获取网络数据的时候,如果程序传输数据很慢,那么程序就一直等待着,直到数据传输完成。

    非阻塞:应用程序直接可以获取已经准备就绪的数据, 无须等待。

    BIO和NIO的本质区别就是阻塞和非阻塞。

    3.3 同步和异步

    同步和异步一般是面向操作系统与应用程序对I/O操作的层面上区别的。

    同步:应用程序会直接参与IO读写操作,并且我们的应用程序会直接阻塞到某个方法上,直到数据准备完毕。

    异步:所有的IO操作交个操作系统处理,与我们应用程序没有直接关系,我们程序不需要关系IO读写,当操作系统完成了 IO读写的时候,会给我们应用程序发出通知,数据传输完毕。

    3.4 在Java网络通信中同步和异步 阻塞和非阻塞

    同步异步说的是Server服务器端的执行方式

    阻塞和非阻塞说的就是接受数据的方式

    BIO为同步阻塞模式,NIO为同步非阻塞。NIO并没有实现异步,在JDK1.7以后,升级了NIO库包,指出异步非阻塞通信模式NIO 2.0(AIO)。

    展开全文
  • 常规的误区 ... ...  这个时候你问别人,刚刚代码发起的这个请求是不是一个同步请求,对方一定回答是。这是对的,它确实是。...对方一定是这样回答的,“因为发起... 不是因为代码卡住不动了才叫同步请求,而是因为它是同步
  • 同步异步/阻塞非阻塞

    千次阅读 多人点赞 2019-05-27 16:47:05
    同步异步是针对应用程序与内核的交互而言。也就是上图的read操作,从缓存中读取数据,如果缓存中数据还没有准备好,如果是同步操作,它会一直等待,直到操作完成。如果是异步操作,那么它会去做别的事情,等待数据...

    网络中获取数据的读操作步骤:
    等待数据准备。
    数据从内核空间拷贝到用户空间。

    同步与异步:
    同步与异步是针对应用程序与内核的交互而言。也就是上图的read操作,从缓存中读取数据,如果缓存中数据还没有准备好,如果是同步操作,它会一直等待,直到操作完成。如果是异步操作,那么它会去做别的事情,等待数据准备好,内核通知它,它再去读取数据。

    同步过程中进程触发IO操作并等待或者轮询的去查看IO操作是否完成。
    异步过程中进程触发IO操作以后,直接返回,做自己的事情,IO操作交给内核来处理,完成后内核通知进程IO完成。
    同步和异步是相对于操作结果来说,会不会等待结果返回。
    阻塞与非阻塞:
    应用进程请求IO操作时,如果数据未准备好,如果请求立即返回就是非阻塞,不立即返回就是阻塞。简单来说,就是做一件事如果不能立即获得返回,需要等待,就是阻塞,否则可以理解为非阻塞。

    阻塞和非阻塞是相对于线程是否被阻塞。
    异步/同步和阻塞/非阻塞的区别:
    其实,这两者存在本质区别,他们的修饰对象是不同的。 阻塞和非阻塞是指进程访问的数据如果尚未准备就绪,进程是否需要等待,简单来说这相当于函数内部的实现区别 ,也就是未就绪时是直接返回还是等待就绪。
    而同步和异步是指访问数据的机制 ,同步一般指主动请求并等待IO操作完毕的方式 ,当数据就绪后再读写的时候必须阻塞,异步则指主动请求数据后便可以继续处理其它任务,随后等待IO操作完毕的通知,这可以使进程再数据读写时也不阻塞。

    同步/异步 与 阻塞/非阻塞的组合方式
    故事:老王烧开水
    出场人物:老王,两把水壶(水壶,响水壶)

    同步阻塞: 效率是最低的,实际程序中,就是fd未设置O_NONBLOCK 标志位的read/write操作。
    老王用水壶烧水,并且站在那里(阻塞),不管水开没开,每隔一定时间看看水开了没(同步->轮询)。
    同步非阻塞: 实际上效率是低下的,注意对fd设置O_NONBLOCK 标志位。
    老王用水壶烧水,不再傻傻的站在那里,跑去做别的事情(非阻塞),但是还是会每个一段时间过来看看水开了没,没开就继续去做的事情(同步->轮询)。
    异步阻塞: 异步操作是可以被阻塞住的,只不过它不是在处理消息时阻塞,而是在等待消息时被阻塞。比如select函数,假如传入的最后一个timeout函数为NULL,那么如果所关注的事件没有一个被触发,程序就会一直阻塞在select调用处。
    老王用响水壶烧水,站在那里(阻塞),但是不再去看水开了没,而是等水开了,水壶会自动通知它(异步,内核通知进程)。
    异步非阻塞: 效率更高,注册一个回调函数,就可以去做别的事情。
    老王用响水壶烧水。跑去做别的事情(非阻塞),等待响水壶烧开水自动通知它(异步,内核通知进程)
    socket的fd是什么?
    fd是(file descriptor/文件描述符) ,这种一般是BSD Socket的用法,用在Unix/linux系统上。在Unix/linux系统下,一个Socket句柄,可以看做是一个文件,在socket上收发数据,相当于读一个文件进行读写,所以一个socket句柄,通常也用表示文件句柄的fd来表示。

    缓存IO
    缓存IO又被称为标准IO,大多数文件系统的默认IO操作都是缓存IO。 在linux的缓存IO机制中,操作系统会将IO的数据缓存在文件系统的页缓存(page cache)中,也就是说,数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。

    缓存IO缺点:
    数据在传输过程中需要在应用程序地址空间和内核空间进行多次数据拷贝操作,这些数据拷贝带来的CPU以及内存开销是非常大的。
    https://blog.csdn.net/Fly_Fly_Zhang/article/details/90380005

    ============================================================

    近来遇到了一些常见的概念,尤其是网络编程方面的概念,如:阻塞、非阻塞、异步I/O等等,对于这些概念自己也没有太清晰的认识,只是很模糊的概念,说了解吧也了解,但是要让自己准确的描述概念方面的具体细节,却说的不那么准确,这也是自己在这几个方面也没有细细考究过的原因吧。经过看了些这几个概念的资料,发现同步、异步、阻塞、非阻塞的概念其实也并不难以理解,在此写下此文,欢迎拍砖,希望多多交流。

    1 同步与异步#

    首先来解释同步和异步的概念,这两个概念与消息的通知机制有关。也就是同步与异步主要是从消息通知机制角度来说的。

    1.1 概念描述##

    所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列。要么成功都成功,失败都失败,两个任务的状态可以保持一致。

    所谓异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了。至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠的任务序列

    1.2 消息通知##

    异步的概念和同步相对。当一个同步调用发出后,调用者要一直等待返回消息(结果)通知后,才能进行后续的执行;当一个异步过程调用发出后,调用者不能立刻得到返回消息(结果)。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者

    这里提到执行部件和调用者通过三种途径返回结果:状态、通知和回调。使用哪一种通知机制,依赖于执行部件的实现,除非执行部件提供多种选择,否则不受调用者控制

    1. 如果执行部件用状态来通知,那么调用者就需要每隔一定时间检查一次,效率就很低(有些初学多线程编程的人,总喜欢用一个循环去检查某个变量的值,这其实是一种很严重的错误);

    2. 如果是使用通知的方式,效率则很高,因为执行部件几乎不需要做额外的操作。至于回调函数,其实和通知没太多区别。

    1.2 场景比喻##

    举个例子,比如我去银行办理业务,可能会有两种方式:

    1. 选择排队等候;

    2. 另种选择取一个小纸条上面有我的号码,等到排到我这一号时由柜台的人通知我轮到我去办理业务了;

    第一种:前者(排队等候)就是同步等待消息通知,也就是我要一直在等待银行办理业务情况;

    第二种:后者(等待别人通知)就是异步等待消息通知。在异步消息处理中,等待消息通知者(在这个例子中就是等待办理业务的人)往往注册一个回调机制,在所等待的事件被触发时由触发机制(在这里是柜台的人)通过某种机制(在这里是写在小纸条上的号码,喊号)找到等待该事件的人。

    2 阻塞与非阻塞#

    阻塞和非阻塞这两个概念与程序(线程)等待消息通知(无所谓同步或者异步)时的状态有关。也就是说阻塞与非阻塞主要是程序(线程)等待消息通知时的状态角度来说的。

    2.1 概念描述##

    阻塞调用是指调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能够执行其他业务。函数只有在得到结果之后才会返回。

    有人也许会把阻塞调用和同步调用等同起来,实际上它们是不同的。

    1. 对于同步调用来说,很多时候当前线程可能还是激活的,只是从逻辑上当前函数没有返回而已,此时,这个线程可能也会处理其他的消息。还有一点,在这里先扩展下:

    (a) 如果这个线程在等待当前函数返回时,仍在执行其他消息处理,那这种情况就叫做同步非阻塞;

    (b) 如果这个线程在等待当前函数返回时,没有执行其他消息处理,而是处于挂起等待状态,那这种情况就叫做同步阻塞;

    所以同步的实现方式会有两种:同步阻塞、同步非阻塞;同理,异步也会有两种实现:异步阻塞、异步非阻塞;

    1. 对于阻塞调用来说,则当前线程就会被挂起等待当前函数返回;

    非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。虽然表面上看非阻塞的方式可以明显的提高CPU的利用率,但是也带了另外一种后果就是系统的线程切换增加增加的CPU执行时间能不能补偿系统的切换成本需要好好评估

    2.2 场景比喻##

    继续上面的那个例子,不论是排队还是使用号码等待通知,如果在这个等待的过程中,等待者除了等待消息通知之外不能做其它的事情,那么该机制就是阻塞的,表现在程序中,也就是该程序一直阻塞在该函数调用处不能继续往下执行。

    相反,有的人喜欢在银行办理这些业务的时候一边打打电话发发短信一边等待,这样的状态就是非阻塞的,因为他(等待者)没有阻塞在这个消息通知上,而是一边做自己的事情一边等待。

    但是需要注意了,同步非阻塞形式实际上是效率低下的,想象一下你一边打着电话一边还需要抬头看到底队伍排到你了没有。如果把打电话和观察排队的位置看成是程序的两个操作的话,这个程序需要在这两种不同的行为之间来回的切换,效率可想而知是低下的;而异步非阻塞形式却没有这样的问题,因为打电话是你(等待者)的事情,而通知你则是柜台(消息触发机制)的事情,程序没有在两种不同的操作中来回切换。

    3 同步/异步与阻塞/非阻塞#

    1. 同步阻塞形式

    效率是最低的,

    拿上面的例子来说,就是你专心排队,什么别的事都不做。

    实际程序中:就是未对fd 设置O_NONBLOCK标志位的read/write 操作;

    1. 异步阻塞形式

    如果在银行等待办理业务的人采用的是异步的方式去等待消息被触发(通知),也就是领了一张小纸条,假如在这段时间里他不能离开银行做其它的事情,那么很显然,这个人被阻塞在了这个等待的操作上面;

    异步操作是可以被阻塞住的,只不过它不是在处理消息时阻塞,而是在等待消息通知时被阻塞。

    比如select 函数,假如传入的最后一个timeout参数为NULL,那么如果所关注的事件没有一个被触发,程序就会一直阻塞在这个select 调用处

    1. 同步非阻塞形式

    实际上是效率低下的,

    想象一下你一边打着电话一边还需要抬头看到底队伍排到你了没有,如果把打电话和观察排队的位置看成是程序的两个操作的话,这个程序需要在这两种不同的行为之间来回的切换,效率可想而知是低下的。

    很多人会写阻塞的read/write 操作,但是别忘了可以对fd设置O_NONBLOCK 标志位,这样就可以将同步操作变成非阻塞的了

    1. 异步非阻塞形式

    效率更高,

    因为打电话是你(等待者)的事情,而通知你则是柜台(消息触发机制)的事情,程序没有在两种不同的操作中来回切换

    比如说,这个人突然发觉自己烟瘾犯了,需要出去抽根烟,于是他告诉大堂经理说,排到我这个号码的时候麻烦到外面通知我一下(注册一个回调函数),那么他就没有被阻塞在这个等待的操作上面,自然这个就是异步+非阻塞的方式了。

    如果使用异步非阻塞的情况,比如aio_*组的操作,当发起一个aio_read操作时,函数会马上返回不会被阻塞,当所关注的事件被触发时会调用之前注册的回调函数进行处理

    很多人会把同步和阻塞混淆,我想是因为很多时候同步操作会以阻塞的形式表现出来,比如很多人会写阻塞的read/write操作,但是别忘了可以对fd设置O_NONBLOCK标志位,这样就可以将同步操作变成非阻塞的了。但最根本是因为没有区分这两个概念,比如阻塞的read/write操作中,其实是把消息通知机制和等待消息通知的状态结合在了一起,在这里所关注的消息就是fd是否可读/写,而等待消息通知的状态则是对fd可读/写等待过程中程序(线程)的状态。当我们将这个fd设置为非阻塞的时候,read/write操作就不会在等待消息通知这里阻塞,如果fd不可读/写则操作立即返回。

    同样的,很多人也会把异步和非阻塞混淆,因为异步操作一般都不会在真正的IO操作处被阻塞,比如如果用select函数,当select返回可读时再去read一般都不会被阻塞,而是在select函数调用处阻塞

    4 小明的故事#

    对上面所讲的概念再次进行一个场景梳理,上面已经明确说明,同步/异步关注的是消息通知的机制,而阻塞/非阻塞关注的是程序(线程)等待消息通知时的状态。以小明下载文件打个比方,从这两个关注点来再次说明这两组概念,希望能够更好的促进大家的理解。

    1. 同步阻塞:小明一直盯着下载进度条,到 100% 的时候就完成。

    同步体现在:等待下载完成通知;

    阻塞体现在:等待下载完成通知过程中,不能做其他任务处理;

    1. 同步非阻塞:小明提交下载任务后就去干别的,每过一段时间就去瞄一眼进度条,看到 100% 就完成。

    同步体现在:等待下载完成通知;

    非阻塞体现在:等待下载完成通知过程中,去干别的任务了,只是时不时会瞄一眼进度条;【小明必须要在两个任务间切换,关注下载进度】

    1. 异步阻塞:小明换了个有下载完成通知功能的软件,下载完成就“叮”一声。不过小明仍然一直等待“叮”的声音(看起来很傻,不是吗)。

    异步体现在:下载完成“叮”一声通知;

    阻塞体现在:等待下载完成“叮”一声通知过程中,不能做其他任务处理;

    1. 异步非阻塞:仍然是那个会“叮”一声的下载软件,小明提交下载任务后就去干别的,听到“叮”的一声就知道完成了。

    异步体现在:下载完成“叮”一声通知;

    非阻塞体现在:等待下载完成“叮”一声通知过程中,去干别的任务了,只需要接收“叮”声通知即可;【软件处理下载任务,小明处理其他任务,不需关注进度,只需接收软件“叮”声通知,即可】

    也就是说,同步/异步是“下载完成消息”通知的方式(机制),而阻塞/非阻塞则是在等待“下载完成消息”通知过程中的状态(能不能干其他任务),在不同的场景下,同步/异步、阻塞/非阻塞的四种组合都有应用。

    所以,综上所述,同步和异步仅仅是关注的消息如何通知的机制,而阻塞与非阻塞关注的是等待消息通知时的状态。也就是说,同步的情况下,是由处理消息者自己去等待消息是否被触发,而异步的情况下是由触发机制来通知处理消息者,所以在异步机制中,处理消息者和触发机制之间就需要一个连接的桥梁

    在银行的例子中,这个桥梁就是小纸条上面的号码。

    在小明的例子中,这个桥梁就是软件“叮”的声音。

    最后,请大家注意理解“消息通知机制”和“等待消息通知时的状态”这两个概念,这是理解四个概念的关键所在。
    链接:https://www.jianshu.com/p/aed6067eeac9
     

    展开全文
  • 一、同步异步的区别:同步和异步的理解同步:一个服务的完成需要依赖其他服务时,只有等待被依赖的服务完成后,才算完成,这是一种可靠的服务序列。要么成功都成功,失败都失败,服务的状态可以保持一致。异步:一...
  • 主要介绍了java 同步异步阻塞和非阻塞分析的相关资料,需要的朋友可以参考下
  • 同步异步: 概念:消息的通知机制 解释:涉及到IO通知机制;所谓同步,就是发起调用后,被调用者处理消息,必须等处理完才直接返回...阻塞、非阻塞: 概念:程序等待调用结果时的状态 解释:涉及到CPU线程调...
  • 理解同步异步与阻塞非阻塞的区别

    千次阅读 2019-01-09 10:44:46
    同步异步与阻塞非阻塞的概念对于很多初学者来说是一个模糊的概念,其实我们的生活中存在着很多同步和异步的例子。 同步和异步关注的是消息通信机制 在计算机领域,同步就是指一个进程在执行某个请求的时候,若该...
  • Java之阻塞和非阻塞以及同步异步的区别

    万次阅读 多人点赞 2018-05-16 10:47:22
    转载:https://www.cnblogs.com/George1994/p/6702084.html阻塞和非阻塞同步异步1 例子故事:老王烧开水。出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。老王想了想,有好几种等待...
  • 同步异步、阻塞、非阻塞IO总结(IO模型总结)

    万次阅读 多人点赞 2019-04-09 22:51:53
    知识点概念IO操作概念同步异步(IO模型中的概念,并非并发模式中的同步异步)阻塞、非阻塞同步IO模型异步IO模型读写(read write)与阻塞和非阻塞各种IO模型异同对比 IO操作概念 在Unix系统中,一切都是文件。...
  • 同步异步阻塞非阻塞

    2015-04-29 10:12:22
    同步异步阻塞非阻塞
  • 网上闲逛技术贴,看见一个关于理解同步阻塞、同步非阻塞、异步阻塞、异步非阻塞比较风趣的故事,简单明了,很容易理解,因此记录一下,希望更多人能看见。 故事原文: 老张爱喝茶,废话不说,煮开水。出场人物:老张...
  • tcp socket同步 异步 阻塞 非阻塞 的解释.zip 基本概念:同步异步阻塞和非阻塞的区别 同步异步与阻塞非阻塞的区别 C++ 同步异步与阻塞非阻塞的区别
  • 作者:知乎用户 ... 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,商业转载请注明出处。...阻塞就是 recv/read的时候 socket接收缓冲区要是有数据就读, 没数据我就一直睡觉赖着不走,直到有数据来了
  • 主要介绍了科学知识:同步异步阻塞和非阻塞区别,本文分别讲解了这些概念,需要的朋友可以参考下
  • 同步异步阻塞和非阻塞是大家经常会听到的概念,但是它们是从不同维度来描述一件事情,常常很容易混为一谈。 前言 线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: ...
  • 本文档,是我本人翻译的一篇介绍linux系统同步异步阻塞非阻塞的知识的,你在网上看到的百分之八十的知识,可能都以讹传讹,让你看的一知半解,因为网上很多该类博客,没有讲解清楚,举得例子:如老王烧水,小王银行...
  • 简述js中的同步阻塞和异步非阻塞

    千次阅读 2019-05-24 11:14:00
    要想了解js中的同步阻塞和异步非阻塞,首先我们要对进程和线程的基本概念有一个清楚 的了解。 进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,简单来说你的电脑每运行一个程序就是一个进程。 线程:...
  • 本文主要讲了IO中同步异步与阻塞、非阻塞的区别。希望对你的学习有所帮助。
  • 同步异步,阻塞,非阻塞 同步异步 阻塞与非阻塞 IO模型(Reference Link) ​ 阻塞I/O模型 非阻塞I/O模型 进程把一个套接口设置成非阻塞是在通知内核:当所请求的I/O操作不能满足要求时候,不把本进程...
  • 很多时候我们常常看到同步异步,阻塞与非阻塞的出现。有的地方直接将同步与阻塞画上了等号。异步非阻塞画上了等号。事实上这是不对的。同步不等于阻塞,而异步也不等于非阻塞。下面就来仔细的看看同步异步、...
  • 【辰兮要努力】:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着...文章目录一、I/O 阻塞、非阻塞二、I/O 同步异步三、I/O 对比小结 一、I/O 阻塞、非阻塞 Java面试会常常问到什么是阻塞.
  • http://www.iteye.com/topic/1131578#2399581 http://www.ibm.com/developerworks/cn/linux/l-async/ ...同步异步站在任务调度者看任务之间有无顺序关系; 阻塞和非阻塞是站在CPU角度看内设(cpu
  • linux:阻塞和非阻塞同步异步

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 131,796
精华内容 52,718
关键字:

同步非阻塞和异步非阻塞