阻塞/阻塞/同步/异步

简介: 咱就说有没有一种可能,同步、异步、阻塞、非阻塞,这几个关键词拆开看都感觉挺明白的。但是同步阻塞、同步非阻塞、异步阻塞、异步非阻塞,这几个关键词组装起来,看起来就有点那么晦涩了。这个在日常八股中经常出现字眼,其背后对应的到底是个什么样的逻辑?我们来一起揭开它那不那么神秘的面纱。/手动狗头。

前言

image.png
咱就说有没有一种可能,同步、异步、阻塞、非阻塞,这几个关键词拆开看都感觉挺明白的。但是同步阻塞、同步非阻塞、异步阻塞、异步非阻塞,这几个关键词组装起来,看起来就有点那么晦涩了。这个在日常八股中经常出现字眼,其背后对应的到底是个什么样的逻辑?我们来一起揭开它那不那么神秘的面纱。/手动狗头。

同/异步跟是否阻塞有什么必然的联系?

同步、异步在编程中经常遇到,所以这两种也是极为重要的一个概念。但是网上很多解释感觉有点欠缺,例如:

  • 同步:就是在发出一个调用时,在没有得到结果之前, 该调用就不返回。
  • 异步:就是在发出一个调用时,这个调用就直接返回了,等执行完回调结果或者没有结果。
  • 阻塞:就是在调用结果返回之前,当前调用的线程会被挂起,调用线程只有在得到结果之后才会返回。
  • 非阻塞:就是在调用结果不能立即得到之前,该调用的线程不会阻塞。

如果只是粗略这么一看,好像并没有什么问题,但是如果仔细的思考一下,假如同步是发起了一个调用后, 没有得到结果之前不返回, 那这个调用是不是就是被阻塞了?同理,如果异步调用是发出了以后就直接返回了, 那它是不是这个调用没有被阻塞呢?
所以说,正确的解释应该是,虽然它的核心关注点在于消息通信机制,但消息的通信有可能是阻塞的或非阻塞的,也就是同步或异步的,而消息的通信有发送方跟接收方,所以要针对发送方跟接收方区别对待,在《操作系统概念》一书中也有具体的描述,它又分为:阻塞式发送、非阻塞式发送、阻塞式接收、非阻塞式接收。如果拿这个调用线程来看的话,阻塞和同步、非阻塞和异步,本身就是一种同义词。

如何理解它们?

可能上述看完以后还是很懵懂,你可能还是觉得这样也解释不通,那我们就先暂且拆开,按如下定义:

  • 同步、异步:核心在于消息通信机制
  • 阻塞、非阻塞:核心在于在等待调用结果时的状态。

1、同步阻塞

image.png

2、同步非阻塞

image.png

3、异步阻塞

这种场景在实际的开发中几乎是没有的,因为如果的调用方异步处理了,就不会阻塞了。
image.png

4、异步非阻塞

image.png
请你仔细的翻看上诉图片,我们在总结一下开头所定义的就是:

  • 同步、异步:核心在于消息通信机制,这个"消息通信机制"就是水壶。
  • 阻塞、非阻塞:核心在于在等待调用结果时的状态,这个"等待调用结果时的状态"就是你在等待水壶烧开水的状态。

也就是:

  • 水壶烧开水会发生报警通知你已经完成烧开水这个任务,这就是"消息通信机制"。
  • 水壶在烧水的过程中,你不必在水壶前等待水烧开,你可以刷抖音或者从事其他事情,在听到水壶报警通知以后在进行泡茶的任务,这就是"等待调用结果时的状态"。

如果在白话一点就是:

  • 同步:做了同步操作后(烧水),被调用者(水壶)不会主动通知我结果,我需要主动查看结果(水是否烧开)。
  • 异步:做了异步操作后,被调用者会(水壶)主动通知我结果(水是否烧开)是什么。
  • 阻塞:调用功能后(烧水),不能做其他事情(只能等水开)。
  • 非阻塞:调用功能后(烧水),可以做其他事情(刷抖音)。
  • 同步阻塞:执行功能时(烧水),我不能做其他事情,并且功能(烧水)执行完后,不会主动通知我结果(水是否烧开)。
  • 同步非阻塞:执行功能时(烧水),我可以做其他事情(刷抖音),但是功能(烧水)执行完后,不会主动通知我结果(水是否烧开)。
  • 异步阻塞:执行功能时(烧水),我不能做其他事情,并且功能(烧水)执行完后,会主动通知我结果(水是否烧开)。---这个操作没有
  • 异步非阻塞:执行功能时(烧水),我可以做其他事情(刷抖音),并且功能(烧水)执行完后,会主动通知我结果(水是否烧开)。

小结

本文对调用方的同步&异步、阻塞&非阻塞进行了扫盲,但实际场景中往往比文中阐述的要复杂的多,你可以根据网络其他文章进行综合扩展,在弄明白这几种概念以后,在理解网络编程中5种IO模型或者Netty等网络框架才能打通任督二脉,无师自通。

目录
相关文章
|
12月前
阻塞式/非阻塞式与同步/异步的区别
阻塞式/非阻塞式与同步/异步的区别
49 0
|
调度 C++
进程、线程、并发、并行、同步、异步、阻塞、非阻塞
乎所有的操作系统都支持同时运行多个任务,一个任务通常就是一个程序,每个运行中的程序就是一个进程。当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个线程。
理解阻塞、非阻塞与同步、异步的区别
理解阻塞、非阻塞与同步、异步的区别
理解阻塞、非阻塞与同步、异步的区别
网络基础 - 同步、异步、阻塞、非阻塞
网络基础 - 同步、异步、阻塞、非阻塞
159 0
同步、异步、阻塞、非阻塞
同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication) 真正意义上的 异步IO 是说内核直接将数据拷贝至用户态的内存单元,再通知程序直接去读取数据。
968 0
同步,异步,阻塞和非阻塞
同步,异步,阻塞和非阻塞的理解
1636 0
|
缓存 Java
同步 异步 阻塞 非阻塞
在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解。具体如下:  序号 问题 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同步阻塞? 6 什么是同步非阻塞? 7 什么是异步阻塞? 8 什么是异步非阻塞? 散仙不才,在查了一部分资料后,愿试着以通俗易懂的方式
1842 1