Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >同步与异步/阻塞与非阻塞/回调【面试+工作】

同步与异步/阻塞与非阻塞/回调【面试+工作】

作者头像
Java帮帮
发布于 2018-12-07 03:31:12
发布于 2018-12-07 03:31:12
1.3K0
举报

一、同步与异步

概念性

同步异步通常用来形容一次方法调用。

  • 同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。
  • 异步方法调用更像一个消息传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。而,异步方法通常会在另外一个线程中,“真实”地执行着。整个过程,不会阻碍调用者的工作。

图示例

举个例子

  打个比方,比如我们去购物,如果你去商场实体店买一台空调,当你到了商场看中了一款空调,你就想售货员下单。售货员去仓库帮你调配物品。这天你热的实在不行了。就催着商家赶紧给你配送,于是你就等在商场里,候着他们,直到商家把你和空调一起送回家,一次愉快的购物就结束了。这就是同步调用。

  不过,如果我们赶时髦,就坐再家里打开电脑,在网上订购了一台空调。当你完成网上支付的时候,对你来说购物过程已经结束了。虽然空调还没有送到家,但是你的任务都已经完成了。商家接到你的订单后,就会加紧安排送货,当然这一切已经跟你无关了,你已经支付完成,想什么就能去干什么了,出去溜达几圈都不成问题。等送货上门的时候,接到商家电话,回家一趟签收即可。这就是异步调用。

二、阻塞与非阻塞

阻塞与非阻塞关注的是交互双方是否可以弹性工作。假设对象 A 和对象 B 进行交互,而对象 B 对一个问题需要思考一段时间才能回复 A,那么对象 A 可以选择等待对象 B 回复,这种方式就是一种阻塞式交互,与此同时,对象 A 可以选择在对象 B 进行思考的时间去完成别的工作,等到对象 B 完成思考后再进行后续交互,这种方式就是一种非阻塞式的交互。

一般来说,阻塞与非阻塞式用来形容 CPU 消耗的。我们把 CPU 停下来等待慢操作完成以后再接着工作称为阻塞;把 CPU 在慢操作完成之前去完成其他工作,等慢操作完成后再接着工作称为非阻塞。

而阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作函数的实现方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值。

一般来说IO模型可以分为:同步阻塞,同步非阻塞,异步阻塞,异步非阻塞。

同步阻塞IO

在此种方式下,用户进程在发起一个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后,用户进程才能运行。

同步非阻塞IO

在此种方式下,用户进程发起一个IO操作以后可返回做其它事情,

但是用户进程需要时不时的询问IO操作是否就绪,这就要求用户进程不停的去询问,从而引入不必要的CPU资源浪费。

异步阻塞IO

此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,

等内核完成IO操作以后会通知应用程序,这其实就是同步和异步最关键的区别同步必须等待或者主动的去询问IO是否完成,

异步非阻塞IO

在此种模式下,用户进程只需要发起一个IO操作然后立即返回,

等IO操作真正的完成以后,应用程序会得到IO操作完成的通知,

此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作因为真正的IO读取或者写入操作已经由内核完成了。

三、回调

回调:简单来说,就是我调用你的函数,你调用我的函数。正规一点的说法就是类A的a()函数调用类B的b()函数,当类B的b()函数的执行时又去调用类A里的函数。是一种双向的调用方式。一般情况下,回调分两种,分别是同步回调和异步回调。

同步回调:一种双向调用模式,被调用方在函数被调用时也会调用对方的函数。下面用一个计算器的例子来展示(为了方便,写在一个文件里)。

运行结果: 10452 + 423 = 10875 /========================/

异步回调:一种类似消息或事件的机制,被调用方在函数在收到某种讯息或发生某种事件时,才去调用对方的函数,即通过异步消息进行通知。简单来说,类A的a()函数调用类B的b()函数,但是b()函数很耗时,不确定什么时候执行完毕,如果是同步调用的话会等b()执行完成后才往下执行回调类A中的函数,如果是异步回调的话调用了b()函数,虽然b()函数没有执行完,但仍然继续往下执行,为了完成这点,就需要另开一个线程了。下面还是用一个计算器的例子来展示(为了方便,写在一个文件里)。

运行结果:

/========================/

10452 + 423 = 10875

你会发现,输出”/====/”明明是放在代码的最后执行的,结果却先执行输出了,这是因为开了另一个线程,而异步回调和同步回调最大的不同就是异步回调里新建了一个子线程。异步回调常见于请求服务器数据,当取到数据时,会进行回调。

扩展知识:另一种回调(同步),主要是为解决当实现的逻辑不明确时的问题。还是用计算器的例子,比如不一定用计算器进行加法运算,也有可能进行乘法运算(为了方便,写在一个文件里)。

运行结果: 10452 * 423 = 4421196 /========================/

异步回调也同理,在Calculator类的calculation()函数里新建一个线程就行了,这里就不举例了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-11-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java帮帮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
网络IO之阻塞、非阻塞、同步、异步总结
1、前言   在网络编程中,阻塞、非阻塞、同步、异步经常被提到。unix网络编程第一卷第六章专门讨论五种不同的IO模型,Stevens讲的非常详细,我记得去年看第一遍时候,似懂非懂,没有深入理解。网上有详细的分析:http://blog.csdn.net/historyasamirror/article/details/5778378。我结合网上博客和书总结一下,加以区别,加深理解。 2、数据流向   网络IO操作实际过程涉及到内核和调用这个IO操作的进程。以read为例,read的具体操作分为以下两个部分
李海彬
2018/03/23
1.1K0
Java|网络IO之同步、异步、阻塞、非阻塞
最近在看《大型分布式网站架构-设计与实践》这本书时,文中提到阻塞式IO,其实之前我在看一些书籍时也经常听到同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO这些词。 那么同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别呢? 一、网络IO操作过程 对于一个网络IO (这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的过程process (or thread),另一个就是系统
黄小怪
2018/05/21
3K3
同步/异步,阻塞/非阻塞
什么是同步和异步 同步和异步是针对应用程序和内核的交互而言的, 同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪,而异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知。 什么是阻塞和非阻塞 阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值。 同步/异步与阻塞/非阻塞的区别 同步与异步:针对数据访问的方式,程序是主动去询
欠扁的小篮子
2018/04/11
3.3K0
socket阻塞与非阻塞,同步与异步I/O模型
作者:huangguisu 原文出处:http://blog.csdn.net/hguisu/article/details/7453390
bear_fish
2018/09/20
3.6K0
socket阻塞与非阻塞,同步与异步I/O模型
IO-同步、异步、阻塞、非阻塞
https://blog.csdn.net/historyasamirror/article/details/5778378
小梁编程汇
2021/12/08
1.3K0
IO-同步、异步、阻塞、非阻塞
同步、异步、阻塞、非阻塞
同步、异步、阻塞和非阻塞(网络编程) 同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。 按照这个定义,其实绝大多数函数都是同步调用(例如sin, isdigit等)。但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。最常见的例子就是 SendMessage。该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。当对方处理完毕以后,该函数才把消息处理函数所返回的 LRESULT值返回给调用者。 异步 异步的概念和同步相对。当
张俊怡
2018/04/24
2.3K0
同步、异步、阻塞、非阻塞
同步与异步是针对应用程序与内核的交互而言的。同步过程中进程触发IO操作并等待或者轮询的去查看IO操作是否完成。异步过程中进程触发IO操作以后,直接返回,做自己的事情,IO交给内核来处理,完成后内核通知进程IO完成。
菲宇
2019/06/13
3.2K0
java高并发系列-第1天:必须知道的几个概念
接下来一个月,咱们一起啃下java高并发,欢迎留言打卡,一起坚持一个月,拿下java高并发。
路人甲Java
2019/12/10
8620
java高并发系列-第1天:必须知道的几个概念
深入理解并发/并行,阻塞/非阻塞,同步/异步
1、阻塞,非阻塞 首先,阻塞这个词来自操作系统的线程/进程的状态模型中,如下图: 进程状态 一个线程/进程经历的5个状态,创建,就绪,运行,阻塞,终止。各个状态的转换条件如上图,其中有个阻塞状态,就是
用户1332428
2018/03/09
1.3K0
深入理解并发/并行,阻塞/非阻塞,同步/异步
Python 中的进程、线程、协程、同步、异步、回调
进程和线程究竟是什么东西?传统网络服务模型是如何工作的?协程和线程的关系和区别有哪些?IO过程在什么时间发生? 在刚刚结束的 PyCon2014 上海站,来自七牛云存储的 Python 高级工程师许智翔带来了关于 Python 的分享《Python中的进程、线程、协程、同步、异步、回调》。 一、上下文切换技术 简述 在进一步之前,让我们先回顾一下各种上下文切换技术。 不过首先说明一点术语。当我们说“上下文”的时候,指的是程序在执行中的一个状态。通常我们会用调用栈来表示这个状态——栈记载了每个调用层级执行到哪
小小科
2018/05/02
1.7K0
聊聊同步与异步、阻塞与非阻塞、I/O模型
程序员:假如我们执行A,B两个IO操作的时候,如果必须等待A完成后才能执行B那么这个就是
咻一咻
2020/05/29
1.3K0
socket阻塞与非阻塞,同步与异步、I/O模型
在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:
用户6280468
2022/03/21
3.5K0
socket阻塞与非阻塞,同步与异步、I/O模型
阻塞 & 非阻塞 | 同步 & 异步
一个典型的IO操作包括了两个阶段,数据准备和数据读写。比如说现在要使用 recv 执行一个读操作,数据就绪就是远端是否有数据可读。
看、未来
2021/10/09
3K0
阻塞 & 非阻塞 | 同步 & 异步
socket阻塞与非阻塞,同步与异步、I/O模型
在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:
黄规速
2022/04/14
2.9K0
socket阻塞与非阻塞,同步与异步、I/O模型
网络编程 同步,阻塞,异步,非阻塞之区别
同步是在操作系统层面上,阻塞是在套接字上 Reactor是同步 Proactor是异步?
苦叶子
2023/06/09
4350
网络编程 同步,阻塞,异步,非阻塞之区别
同步、异步、阻塞和非阻塞
同步和异步 同步:是用户线程发起IO请求需要等待或者轮询内核IO操作完成后才能继续执行。 异步:用户线程发起IO请求后任需要继续执行,当内核IO操作完成后会通知用户线程,或者调用用户注册的回调函数。
lexingsen
2022/02/25
2.3K0
深入理解--异步和非阻塞同步和阻塞异步和非阻塞
异步和非阻塞的概念实际上已经出现了很长一段时间。但是异步真正开始流行起来,是因为AJAX技术逐渐成为主流的web开发技术。非阻塞的概念真正流行起来,是当java引入NIO,也可以称作非阻塞IO的API,开始走进主流的开发人员的视线,真正流行起来,也可以认为是node.js带来的。
desperate633
2018/08/22
1.1K0
深入理解IO:同步、异步、阻塞与非阻塞
在计算机世界中,IO是一个无处不在的概念,它是"输入/输出"的简称。简单来说,IO就是计算机与外部世界(例如硬件设备或网络)进行数据交换的过程。为了更好地理解IO,我们需要熟悉一些相关的概念,包括同步/异步和阻塞/非阻塞。这些概念看似复杂,但只要我们能理解他们之间的区别,就能够更好地理解IO的工作机制。
运维开发王义杰
2023/08/10
1.7K0
深入理解IO:同步、异步、阻塞与非阻塞
同步IO、异步IO、阻塞IO、非阻塞IO之间的联系与区别
同步IO、异步IO、阻塞IO、非阻塞IO,这几个词常见于各种各样的与网络相关的文章之中,往往不同上下文中它们的意思是不一样的,以致于我在很长一段时间对此感到困惑,所以想写一篇文章整理一下。
lyb-geek
2018/07/26
1.5K0
同步IO、异步IO、阻塞IO、非阻塞IO之间的联系与区别
如何给女朋友解释什么是IO中的阻塞、非阻塞、同步、异步?
周末在家加班,正在疯狂的撸代码,女朋友很开心的跑过来,手里拿着他刚刚画好的一副漫画。
Java团长
2019/07/01
9820
如何给女朋友解释什么是IO中的阻塞、非阻塞、同步、异步?
推荐阅读
相关推荐
网络IO之阻塞、非阻塞、同步、异步总结
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档