同步异步 阻塞非阻塞

首先知道同步异步与阻塞非阻塞不是一个层次的概念

“阻塞”与"非阻塞"与"同步"与“异步"不能简单的从字面理解,提供一个从分布式系统角度的回答。

1.同步与异步

同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)
所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回。但是一旦调用返回,就得到返回值了。
换句话说,就是由*调用者*主动等待这个*调用*的结果。

而异步则是相反,*调用*在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在*调用*发出后,*被调用者*通过状态、通知来通知调用者,或通过回调函数处理这个调用。

例1:

之前一直在写JQUERY代码的时候遇到AJAX加载数据都需要考虑代码运行顺序问题。最近的项目用了到AJAX同步。这个同步的意思是当JS代码加载到当前AJAX的时候会把页面里所有的代码停止加载,页面出去假死状态,当这个AJAX执行完毕后才会继续运行其他代码页面假死状态解除,而异步则这个AJAX代码运行中的时候其他代码一样可以运行。 

jquery的async:false,这个属性 
默认是true:异步,false:同步。

$.ajax({ 

         type: "post", 

         url: "path", 

         cache:false, 

         async:false, 

         dataType: ($.browser.msie) ? "text" : "xml", 

         success: function(xmlobj){ 

        } 

});

有了这个属性可以相对的减少代码运行书序问题,但是如果用的太多,页面假死次数太多。这样反而导致用户体验不佳~!

根据$.Ajax()中 async 和success的官方的解释

async默认的设置值为true,这种情况为异步方式,就是说当ajax发送请求后,在等待server端返回的这个过程中,前台会继续 执行ajax块后面的脚本,直到server端返回正确的结果才会去执行success,也就是说这时候执行的是两个线程,ajax块发出请求后一个线程 和ajax块后面的脚本(另一个线程)例:

$.ajax({  

           type:"POST", 

           url:"Venue.aspx?act=init", 

           dataType:"html", 

           success:function(result){   //function1()

            f1(); 

            f2(); 

        } 

         failure:function (result) {  

            alert('Failed');  

         }, 

  } 

  function2(); 

  在上例中,当ajax块发出请求后,他将停留function1(),等待server端的返回,但同时(在这个等待过程中),前台会去执行function2(),也就是说,在这个时候出现两个线程,我们这里暂且说为function1() 和function2()。

       当把asyn设为false时,这时ajax的请求时同步的,也就是说,这个时候ajax块发出请求后,他会等待在function1()这个地方,不会去执行function2(),知道function1()部分执行完毕

例2:
你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下",然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。
而异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。

2. 阻塞与非阻塞

阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.

阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

还是上面的例子,
你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了, 当然你也要偶尔过几分钟check一下老板有没有返回结果。
在这里阻塞与非阻塞与是否同步异步无关。跟老板通过什么方式回答你结果无关。


转自:
https://www.zhihu.com/question/19732473/answer/20851256 作者:严肃
https://www.cnblogs.com/cai170221/p/7065096.html

转载于:https://www.cnblogs.com/xdyixia/p/9260187.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/570668.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

吴钩:打开宋代的“隐藏玩法”

访谈吴钩   焚香点茶、听风饮酒、赶集贸易、赏春游园,这都是世人所知晓的宋代。但养宠物、爱插花、喜“写真”、会熬夜、懂收藏,才是宋代的“隐藏玩法”。宋画中拥簇的市集、鲜香的食肆、考究的庭房,宋史中政治制度的改良、文化的雅俗共存、…

485. Max Consecutive Ones - LeetCode

Question 485. Max Consecutive Ones Solution 题目大意:给一个数组,取连续1的最大长度 思路:遍历数组,连续1就加1,取最大 Java实现: public int findMaxConsecutiveOnes(int[] nums) {if (nums null) return 0;int result 0;int tmp 0;for (int i : nums) {if (i 1) {tmp;…

Java四种引用包括强引用,软引用,弱引用,虚引用。

强引用: 只要引用存在,垃圾回收器永远不会回收Object obj new Object();//可直接通过obj取得对应的对象 如obj.equels(new Object());而这样 obj对象对后面new Object的一个强引用,只有当obj这个引用被释放之后,对象才会被释放掉…

深入浅出的排序算法-冒泡排序

前言 大家好,给大家带来冒泡排序算法,希望你们喜欢 冒泡排序 为什么这个排序要叫冒泡呢?为什么不叫其他名词呢?其实这个取名是根据排序算法的基本思路命名的,见名知意,冒泡排序,就是想泡泡在水里…

MacBook创建docker私有仓库docker server gave HTTP response to HTTPS client 问题处理办法

在 mac上搭建一个私有仓库,在向仓库push镜像时,会报如下错误: #docker push 192.168.163.131:5000/test Get https://192.168.163.131:5000/v1/_ping: http: server gave HTTP response to HTTPS client 百度了下答案发现都不试用mac版本的d…

Redis基础1(定义及基础)

Redis 定义:Redis是一个软件,帮助开发者对一台机器的内存进行操作 安装redis软件方法: 超链接地址:https://www.cnblogs.com/L5251/articles/9146881.html Python中下载依赖包 pip3 install redis 测试Redis是否安装成功 # 1、引入…

记最近分析的一个锁屏幕病毒

1.病毒运行后现象:病毒程序占满屏幕。鼠标依然在,但是无论点击哪儿都没反应。快捷键(例如ctrlaltdelete,altf4(关闭当前口),alttab(切换窗口)等)全部失效。 关闭电源,用普…

vue-cli安装

、安装vue-cli 命令:npm install vue-cli -g -g表示全局安装 2、初始化项目 命令:vue init webpack my-project 使用vue命令初始化项目,并使用webpack打包 此时会跳出一系列问题,除了eslint那一项,其余的均可回答yes&a…

修复病毒破坏的文件关联并恢复程序图标

1.破坏文件关联的两种方式: (1)修改特定扩展名文件的对应名称。以.exe文件为例: 正常注册表中,.exe文件对应名称为: HKEY_CLASSES_ROOT\.exe (默认) exefile 病毒为…

分享几个病毒分析检测网址

1、在线病毒分析网站: 以下网站上传样本后,很快就会在网页上出报告的: (1)这个网址报告格式很简洁,我很喜欢:http://camas.comodo.com/ (2)这个网址的报告最全面&#xf…

leetcode 关于树的题目

判断一棵树里是否有两个节点的值之和等于某个值。 653. Two Sum IV - Input is a BST Given a Binary Search Tree and a target number, return true if there exist two elements in the BST such that their sum is equal to the given target. Example 1: Input: 5/ \3 6…

基于类的访问权限

一个方法可以访问所属类的所有对象的私有数据 class MyClass{public MyClass(String name){this.name name;}private String name;public boolean equals(MyClass other){return name.equals(other.name); } } 转载于:https://www.cnblogs.com/chenzida/p/9285989.html

双击程序后系统弹框“您无权访问此程序”的解决办法

xp下:我的电脑>工具>文件夹选项>查看,勾掉使用简单文件共享选项。如下图: 此时,在右键点击程序图标时,选项卡中会出现“安全”选项卡。如下图: 修改everyone为Administrator...并设置完全控制权限…

adb常用操作命令

1、adb devices 查看当前链接设备&#xff0c;列出连接到计算机的Android设备或者模拟器 2、adb install <apk文件路径> 安装软件 3、adb uninstall <软件名> 卸载apk之前要先查看报名&#xff1a; 知晓包名之后&#xff0c;就可以运用命令卸载该APK 4、adb shell …

让vs编写的程序在未安装vs的电脑上使用的一种方法

今天编了一个每隔10分钟就弹出一个网页的程序&#xff0c;为的是用来投票。代码如下: #include "stdafx.h" #include <iostream> #include <windows.h> int _tmain(int argc, _TCHAR* argv[]) { int i0; while(i0) { ShellExecute(NULL, "open&…

轻量级ORM框架 【Dapper】 的使用

ORM是什么&#xff1f; 从字面理解&#xff0c;O是Object&#xff0c;对象&#xff1b;R是Relation&#xff0c;关系&#xff1b;M是Mapping&#xff0c;映射。所以&#xff0c;用一句话概括就是&#xff1a;ORM是一种对象关系映射的技术。 Dapper 是.NET下的一种ORM框架。 Dap…

系统提示一个程序正在被另一个程序调用,如何知道是被哪个程序调用

今天在处理一个病毒时&#xff0c;发现病毒文件无法复制。于是利用processxp找到了病毒文件是被哪个文件调用&#xff0c;然后用md关闭了调用句柄后成功复制文件。具体情况如下&#xff1a; 为了找到是哪个程序调用了befsvc.exe&#xff0c;打开processexplorer.exe&#xff0c…

JS实现文本框不可编辑

方法1: οnfοcusthis.blur() 当鼠标放不上就离开焦点 <input type"text" name"input1" value"中国" οnfοcusthis.blur()> 方法2:readonly <input type"text" name"input1" value"中国" readonly>…

通过修改explorer.exe内存隐藏文件及注册表项

记录今天分析的一个隐藏自身及注册表项的病毒。 1.概述&#xff1a; &#xff08;1&#xff09;此病毒文件为路径为&#xff1a;C:\Windows7\4D525EC1C14.exe&#xff0c;且注册了自启动项&#xff1a; HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run […

WPF xaml中列表依赖属性的定义

WPF xaml中列表依赖属性的定义 原文:WPF xaml中列表依赖属性的定义列表内容属性 如上图&#xff0c;是一个列表标题排序控件&#xff0c;我们需要定义一个标题列表&#xff0c;从而让调用方可以自由的设置标题信息。 在自定义控件时&#xff0c;会遇到列表依赖属性&#xff0c;…