首先记住一句话,JS是单线程的。

单线程意味着什么?单线程意味着 它不能依靠自己实现异步

JS实现的异步,往往都是靠 浏览器、Node 的机制(事件驱动、回调)实现的。

下面让我这个单身狗 以谈恋爱举例子 来形容上述概念。


问题1.什么是同步和异步?

同步就是顺序执行。

异步就是 最大限度地 利用资源,分配资源 所实现的 能并行多件事情的 假象。

拿谈恋爱理解。 -- 同步、异步 指的是恋爱机制消息通信机制。

  • 同步就是 攻略上说的 先跟一个 女生交往,分手后,再和 下一个女生交往(针对一种现象)。
  • 异步就是 攻略上说的 拿 当前女友 不在的时间,跟另一个 女孩子 恋爱(针对一种现象)。

问题2.什么是阻塞和非阻塞?

阻塞,就是 一个时间只能做一个事情,上一件事情没做完,不能做下一件事情。

非阻塞,就是上一件事情没做完,也可以做另外一件事情。

拿谈恋爱理解。 -- 阻塞、非阻塞 指的是本人的恋爱状态等待调用结果的状态。

  • 阻塞就是 一个人,它和一个女生交往的时候,如果上一个女生没有分手,就不能和另一个女生交往。(针对的是本人)
  • 非阻塞就是 一个人,它和上一个女生开始交往,在还没有分手的情况下,能够立马和下一个女生交往。(针对的是本人)

问题3.什么是并行和并发?

并行,就是一个时间点,能做 多个事情。 (分身术)

并发,就是一个时间段,能做多个事情。(通常说,服务器 1分钟能够处理 1000个请求就是 并发量1000)

拿谈恋爱理解。 -- 并行、并发 的区别在于 时间点 和 时间段。 可以是 效率的一种体现。

  • 并行就是 每一分每一秒 都能同时和两个女生 谈恋爱。 (对于一个人来说,这是不可能的。但是两个人,可以同时和一个女生谈恋爱。所谓电脑的多核)
  • 并发就是 一个人 一年可以 谈两个 女朋友。

问题4.什么是单线程和多线程?

单线程,这是一种处理事情的结构。它代表着 一次只能处理一件事情。

多线程,这也是一种处理事情的结构。它代表着 一次能处理多个事情。

拿谈恋爱理解。 -- 单线程 和 多线程 其实就是 编程语言 特性 的 根本原因。

  • 单线程。 我只是一个人,我有一个身体,一个大脑。
  • 多线程。 我是一群人,我们有很多身体,群策群力。

那么,回到 JS 这个语言来。

  • 1.JS是单线程的。(这里的单线程的意思是指 代码运行 的单线程)

  • 2.它可以异步、也可以同步,因为这是一个现象,JS可以通过 某些手段,来达到这些 效果。

  • 3.他通过 浏览器的 多线程 的特性,来实现 异步操作。(代码运行 单线程)

    他通过 Node.js自身的多线程 来实现 异步操作。(代码运行 单线程)

  • 4.JS的请求,一般不存在 并行,但它能够实现 高并发,通过异步的方式 实现高并发。原则上来讲,不存在 并行。

虽然 node 的 I/O 操作开启了多个线程,但所有的线程 都是基于一个主线程,并行的要求是,同一个时间点,这个要求还是比较苛刻的。

宏观上来讲,可以说是 并行。(伪并行)

JS的缺点,不擅长密集型的工作。例如

for (let i = 0; i < 1000000; i++) {
console.log(i);
}

上面的代码 可能会 执行很久,数字加大后更久了。 会引起 阻塞。


一些需要知道的。

单线程 未必比 多线程 差。
  • 多线程需要频繁地 切换、创建 线程,这些都是 系统开销。
  • 单线程保证了 绝对的线程安全。 不会存在 对同一变量 同时读写的情况。

总结

单线程 和 多线程,是根本原因,是硬件限制。

并发 和 并行,是根本原因 带来的 微观结果。

同步 和 异步,关注的是消息通信机制。

像异步交女朋友这种操作,看看这些攻略就好,它们只是万千攻略(机制)中的一种,未必能够实现

阻塞 和 非阻塞,关注的是程序执行的方式。

往往同步交两个女朋友是不可能的,因为现实往往不允许,所以阻塞才是正常的。

JS之所以能够异步,还是通过浏览器开了后门(线程)。

JS异步解决方案之概念理解-----------阻塞和非阻塞,同步和异步,并发和并行,单线程和多线程的更多相关文章

  1. node.js中对同步,异步,阻塞与非阻塞的理解

    我们都知道javascript是单线程的,node.js是一个基于Chrome V8 引擎的 javascript 运行时环境,注意 node.js 不是一门语言,别搞错了. javascript为什 ...

  2. 简述linux同步与异步、阻塞与非阻塞概念以及五种IO模型

    1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...

  3. Linux中同步与异步、阻塞与非阻塞概念以及五种IO模型

    1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...

  4. 正确理解这四个重要且容易混乱的知识点:异步,同步,阻塞,非阻塞,5种IO模型

    本文讨论的背景是Linux环境下的network IO,同步IO和异步IO,阻塞IO和非阻塞IO分别是什么 概念说明 在进行解释之前,首先要说明几个概念: - 用户空间和内核空间 - 进程切换 - 进 ...

  5. NIO学习笔记,从Linux IO演化模型到Netty—— 究竟如何理解同步、异步、阻塞、非阻塞

    我的观点 首先,分开各自理解. 1. 同步:描述两个(或者多个)个体之间的协调关系. 比如,单线程中,methodA调用了methodB,methodB返回后,methodA才往下执行,那么称A同步调 ...

  6. Linux驱动之异步OR同步,阻塞OR非阻塞概念介绍

    链接:https://www.zhihu.com/question/19732473/answer/20851256 1.同步与异步同步和异步关注的是消息通信机制 (synchronous commu ...

  7. IO操作概念。同步、异步、阻塞、非阻塞

    “一个IO操作其实分成了两个步骤:发起IO请求和实际的IO操作. 同步IO和异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求进程,那么就是同步IO. 阻塞IO和非阻塞IO的区别在于第 ...

  8. socket阻塞与非阻塞,同步与异步、I/O模型,select与poll、epoll比较

    1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步:      所谓同步,就 ...

  9. socket阻塞与非阻塞,同步与异步

    socket阻塞与非阻塞,同步与异步 作者:huangguisu 转自:http://blog.csdn.net/hguisu/article/details/7453390 1. 概念理解 在进行网 ...

随机推荐

  1. CRtmpServer

    1.  前言 crtmpserver是一个由C++语言编写的开源的RTMP流媒体服务器,官方网站是www.rtmpd.com 2.   CRtmpServer编译   2.1.  Win7+Vs201 ...

  2. 最常见的5个导致 RAC 实例崩溃的问题

    适用于: OracleDatabase - Enterprise Edition - 版本11.2.0.1 和更高版本本文档所含信息适用于所有平台 用途 本文档的目的是总结可能导致 RAC 实例崩溃的 ...

  3. 安装phpredis

    1.下载安装包 https://github.com/nicolasff/phpredis/archive/2.2.5.tar.gz 2.解压到~目录 tar -xvf phpredis-2.2.5. ...

  4. 【转】 Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner

    目录(?)[-] GridView Spinner GridView GridView是网格状布局,如图所示.在了解ListView后,很容易了解GridView.下面是例子的XML文件. <? ...

  5. jQuery对象和DOM对象的互换

    Dom 对象:指的是普通的 JavaScript 对象 jQuery对象:是包装 Dom 对象后产生的对象. 一:JQuery 对象和 Dom 对象 在使用 JQuery 过程中,我们一般(也是绝大多 ...

  6. jquery获取设置服务器控件的方法

    jquery获取设置服务器控件的方法 获取TextBox,HiddenField,Label的值.例如: <asp:TextBox ID="txtBoxID" runat=& ...

  7. inner join ,left join ,right join区别

    inner join ,left join ,right join区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中 ...

  8. winform 客户端 HTTP协议与服务端通信以及解决中文乱码

    本来从来没有仔细研究过Http协议,今天因为公司业务需求,调试了半天,终于现在会Winform用Http协议与服务端通信了,其中常用的有POST和Get方式: 仔细看了人人网和新浪等大部分都是采用GE ...

  9. call apply bind 的区别

    1.call和apply都是对函数的直接调用,而bind方法返回的仍然是一个函数,因此后面还需要()来进行调用才可以 var xw={ name: "小王", gender: &q ...

  10. PCL 不同类型的点云之间进行类型转换

    PCL 不同类型的点云之间进行类型转换 可以使用PCL里面现成的函数pcl::copyPointCloud(): #include <pcl/common/impl/io.h> pcl:: ...