同步、异步、阻塞、非阻塞的简单理解

同步和异步, 是消息的通知机制,描述的是两个对象之间的关系
阻塞和非阻塞, 是程序在等待消息(无所谓同步或者异步)时的状态,描述的是单个对象的状态

同步

同步,就是调用一个函数时,在没有得到结果之前,该函数就不返回

异步

异步,就是就是调用一个函数时,该函数直接返回,等到有结果后,再通过状态通知回调函数告诉调用者

阻塞

阻塞是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后线程才继续工作

非阻塞

非阻塞指调用结果返回之前,该函数不会阻塞当前线程

例子

你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下”,然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)

而异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调

你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,如果是非阻塞式调用,你不管老板有没有告诉你,你自己先做其他事,比如看电视

同步阻塞

同步阻塞是指你不挂电话,你无法做其他事

效率最低

“你”可以理解为一个程序,而打电话和做其他事分别是2个操作,打电话的操作没有返回,整个程序还被挂起

同步非阻塞

同步非阻塞是指你不挂电话,你可以做其他事

效率低下,你需要边做其他事,边观察老板有没有告诉你结果

虽然打电话的操作没有返回,但是程序可以先执行其他操作(不是执行打电话之后的操作,而是跟打电话行为平行的操作),程序需要在2个函数之间频繁切换

异步阻塞

异步阻塞是指你挂了电话,但你无法做其他事,等老板打电话过来

效率低下

虽然挂了电话,但是程序无法执行其他操作。程序不是被调用函数阻塞,而是被等待函数结果阻塞

异步非阻塞

异步非阻塞是指你挂了电话,你可以做其他事,等老板打电话过来

效率最高

程序没有在两种不同的操作中来回切换

参考文章

  1. IO中同步、异步与阻塞、非阻塞的区别
  2. 怎样理解阻塞非阻塞与同步异步的区别?
  3. IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇)
一杯冰可乐