同步、异步 阻塞、非阻塞的理解总结
前言:关于这四个概念看起来很简单,实际也确实如此,但是往出讲时突然有点懵,那我们就来写一下,眼过千遍不如手过一遍.
同步、异步 阻塞、非阻塞
同步、异步
同步和异步强调的是消息通信机制 (synchronous communication/ asynchronous communication)。
同步,异步是从被调用者来讲,调用结束后是否主动返回结果。
同步(synchronous)
同步是一种可靠的有序运行机制,当我们进行同步操作时,后续的任务是等待当前调用返回,才会进行下一步。
这个概念非常的好理解:就是当一件事情没有做完之前,不能去开始做下一件事情,例子有很多我们每个人都可以想到。现在我们去优衣库买衣服,看上了一件衣服没有你的尺码,你叫营业员(被调用者)去帮你找,营业员说您等我一下,我现在就去找,在他没有找到之前你一直在原地等待,只有当他回来告诉你找或者未找到时,你才会去做下一件事情。在这个过程中你一直在等待什么也没有做,浪费了资源和时间.
异步
异步则相反,其他任务不需要等待当前调用(结果)返回,通常依靠事件、回调等机制来实现任务间次序关系.。"而是在"调用"发出后,"被调用者"通过状态、通知来通知调用者,或通过回调函数处理这个调用
相对于同步的例子,就是在你叫营业员(被调用者)去帮你找衣服的同时,她告诉你先生你先看看别的款式或者休息一下,我找到了联系您,你不用站在那里一直等着,你可以去看别的衣服,买个Dq吃等等事情,当营业员找完衣服之后通过一些方式告知你结果。这就是异步,在这个过程中你并没有浪费你的时间。
阻塞、非阻塞
阻塞和非阻塞(blocking/non-blocking)强调的是程序在等待调用结果(消息,返回值)时的状态,. 阻塞,非阻塞是从调用者角度来讲的,调用后是否可以去干其他工作。
阻塞
在进行阻塞操作时,当前线程会处于阻塞状态,无法从事其他任务,只有当条件就绪才能继续(当前线程被挂起,得到结果后返回),比如ServerSocket新连接建立完毕,或者数据读取、写入操作完成;
我们接着来说刚才的例子,你让营业员去找衣服,在他没有告诉你结果之前,你就一起挂起等待,直到他来告诉你结果,这就是阻塞.
非阻塞
而非阻塞则是不管IO操作是否结束,直接返回,相应操作在后台继续处理,该调用不会阻塞当前线程。
你让营业员去找衣服,你不等他告诉你结果,你先去看别的,这就是非阻塞。
总结
总结一下就是关注的点不一样,同步异步关注的时过程,阻塞非阻塞光柱的时状态。等后面更进一步学习后回来补充修改。