同步异步,阻塞和非阻塞

同步和异步,阻塞和非阻塞,根据字面意思也能够分出差别,但是同步,异步阻塞,非阻塞很容易混淆,那么同步是不是就是阻塞,异步是不是就是非阻塞?

答案是否定的,虽然同步意味着阻塞,异步意味着不阻塞,但是面对的对象不同,下面是摘自博客园其中一篇博客对同步、异步,阻塞、非阻塞的定义:

同步、异步:

  • 概念:消息的通知机制
  • 解释:涉及到IO通知机制;所谓同步,就是发起调用后,被调用者处理消息,必须等处理完才直接返回结果,没处理完之前是不返回的,调用者主动等待结果;所谓异步,就是发起调用后,被调用者直接返回,但是并没有返回结果,等处理完消息后,通过状态、通知或者回调函数来通知调用者,调用者被动接收结果。阻塞、非阻塞:

阻塞、非阻塞

  • 概念:程序等待调用结果时的状态
  • 解释:涉及到CPU线程调度;所谓阻塞,就是调用结果返回之前,该执行线程会被挂起,不释放CPU执行权,线程不能做其它事情,只能等待,只有等到调用结果返回了,才能接着往下执行;所谓非阻塞,就是在没有获取调用结果时,不是一直等待,线程可以往下执行,如果是同步的,通过轮询的方式检查有没有调用结果返回,如果是异步的,会通知回调。

根据概念,他们讲的就不是同一件事情。

同步和异步是用来形容消息的通知机制,通信机制就是一个Rule,一个规则,同步就是严格按照先后顺序去做事情,比如有时候我们的事情必须一件一件去做,我先开发原型界面,再前后端联调——也就是说我的开发流程这个Rule,我在没有开发完原型界面之前是不会跟后端去联调的,这就是同步;而异步在生活中就很多了,我在家里放了一只老鼠夹,我不可能在旁边看着老鼠上钩,我可以去做其他的事情,直到有一天,老鼠夹发出警报了(这是一个连着app的老鼠夹23333),我发现有老鼠上钩了,这个就是异步。所以它们针对的是Rule,前端开发流程,老鼠夹夹老鼠,这个都是一种Rule,通信机制。

阻塞和非阻塞是用来形容通信一方的状态,比如我打滴滴,师傅接单了,1分钟就到,我站在路边,时刻关注着手机,我的这个状态就是阻塞状态,而如果要10分钟才到,这个时候外面又很热,那我先去买个可乐喝一下,时不时的看一下手机,看看是不是师傅快到了,这个就是非阻塞。

那么为什么会出现阻塞和非阻塞呢?就是因为同步机制造成的,如果是异步,最后事情好了,通知我一声,good!!!我阻塞在那里干嘛,我该干嘛干嘛。但是同步的话我就没办法了,只能等呗,时间少一点无所谓的,那时间一长呢?做点其他的事情呗,时不时的看看后续情况,提高效率。

所以同步都伴随着阻塞和非阻塞,以后再也不要把同步异步,阻塞、非阻塞搞混了。

抛砖引玉,望提出宝贵意见。