对JavaScript中异步同步机制以及线程深入底层了解

今天在网上看到各种对Js异步同步单线程多线程的讨论 经过前辈们的洗礼 加上鄙人小小的理解 就来纸上谈兵一下吧~

Js本身就是单线程的 至于为什么Js是单线程的 那就要追溯到Js的历史了 总而言之 由于Js是浏览器的脚本语言 经常操作dom元素 多线程的话反而会导致更复杂(删除与添加同时进行?)这只是简单的解释了为什么Js要单线程的原因, 为什么Js又能异步执行方法呢? 这特么的不是很矛盾吗!!!

但是,但是注意了 就是因为Js主要是在浏览器中运行的脚本语言 浏览器是典型的GUi工作线程 因为它在绝大多数环境是为实现事件处理,为了避免同步带来的堵塞交互所以它产生了异步的特性(这里还是浏览器的作用和Js本身的主线程没有关系)

Js的单线程在浏览器的同一时刻只有一段代码在执行,而异步机制是浏览器来实现的,由浏览器的两个或者多个常驻线程来共同完成的,而主要任务还是Js的单线程来实现 辅助线程只是另外开辟了一个任务队列 这个任务队列里面会存放所有异步方法执行的结果 ,当Js的主线程栈全部执行完毕以后 它就会去这个任务队列里面去找有没有可执行的任务 如果有就把它插到主线程栈的尾部执行 执行完毕之后然后继续此番循环(Event Loop) 说了这么多概念的东西 不如举个栗子?

常见的异步方法 比如定时器 这个最常用了吧!!

这个例子简单的解释了下异步的执行顺序(异步执行的方法永远排在Js主线程的后面)

打开控制台

console.log(‘我是第一个出现的!!‘)

setTimeout(function(){

console.log(‘我是第三个出现的!!‘)

},0)

console.log(‘我是第二个出现的!!’)

控制台会输出  我是第一个出现的!!

我是第二个出现的!!

我是第三个出现的!!

这是因为定时器在浏览器中有个单独的线程不属于主线程

时间: 2025-01-13 23:15:57

对JavaScript中异步同步机制以及线程深入底层了解的相关文章

JavaScript中异步编程

一 关于事件的异步 事件是JavaScript中最重要的一个特征,nodejs就是利用js这一异步而设计出来的.所以这里讲一下事件机制. 在一个js文件中,如果要运行某一个函数,有2中手段,一个就是直接调用,比如foo(),第二就是利用事件来触发,这中函数也叫回调函数,比如传递给setTimeout函数和onready属性. 1.setTimeout函数中的事件异步 setTimeout本质上也是一种异步事件,当延迟时间到的时候触发该事件,但是有的有的时候(其实也是大部分时候)都不会按照给定的延

JavaScript中的继承机制

JavaScript到底是不是面向对象的?! 有人说是,有人说基于对象更准确,因为JavaScript没有类.不去管它,但JavaScript确实提供了一些面向对象的机制. 本文主要讨论JavaScript中的继承.继承,简单来说,就是让子类获得父类的属性和方法,以达到共享和复用的目的. 在开始继承之前,首先需要创建父类.为了后续讨论的需要,我分别为父类创建了私有对象.实例对象.引用对象和两个实例方法. 创建父类的代码如下: // 父类实例的构造函数 function Pet(name,soun

JavaScript中的垃圾收集机制

 JavaScript 具有自动垃圾收集机制,也就是说,执行环境会负责管理代码执行过程中使用的内存. 在编写 JavaScript 程序时,开发人员不用再关心内存使用问题,所需内存的分配以及无用内存的回收完全实现了自动管理. 这种垃圾收集机制的原理其实很简单:找出那些不再继续使用的变量,然后释放其占用的内存.为此,垃圾收集器会按照固定的时间间隔(或代码执行中预定的收集时间), 周期性地执行这一操作. 具体到浏览器中的实现,则通常有两个策略,分别为标记清除和引用计数. 一.标记清除 JavaScr

javaScript中的同步,异步与回调函数

for (var i = 0; i < 5; i++) { setTimeout(function() { console.log('i: ',i); }, 1000); } console.log(i); 输出结果: //输出 5 i: 5 i: 5 i: 5 i: 5 i: 5 记住我们的口诀,同步=>异步=>回调 1.for循环和循环体外部的console是同步的,所以先执行for循环,再执行外部的console.log.(同步优先) 2.for循环里面有一个setTimeout回

Android中异步消息处理机制

1. Thread Local Storage (线程局部存储)      我们通过位于android.os包下的Looper.class源码可以看到成员变量区有一个线程局部变量sThreadLocal,该类的作用是线程局部存储?那么是线程局部存储TLS?这个问题可以从变量作用域的角度来理解. 变量的常见作用域一般包括以下几种. 函数内部变量.其作用区域是该函数,即每次调用该函数,该变量都会重新回到初始值. 类内部的变量.其作用就是该类所产生的对象,即只要该对象没有被销毁,则对象内部的变量则一直

javascript中异步和闭包产生的困惑

这里我不打算大谈特谈什么是异步,什么是闭包,这些内容在博客园都已经写的够多的了,但是这些内容出现的多,并不代表所有初学者都已经撑握了,所以我还是打算,用一个比较常见的示例来分析一下,或许能让对这个问题有困惑的同学有一种顿悟的感觉.我在上一篇博客<从一道面试题分析闭包>中已经分析过什么是闭包了,但是那个例子应用的场景比较复杂,不适合初学者理解,这里我举一个更常见的例子. 假如有这样一个需求:点击菜单中的每一项,显示所点击的内容,对应的内容页面如下: <!DOCTYPE html> &

【译】深入理解python3.4中Asyncio库与Node.js的异步IO机制

转载自http://xidui.github.io/2015/10/29/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3python3-4-Asyncio%E5%BA%93%E4%B8%8ENode-js%E7%9A%84%E5%BC%82%E6%AD%A5IO%E6%9C%BA%E5%88%B6/ 译者:xidui原文: http://sahandsaba.com/understanding-asyncio-node-js-python-3-4.html 译者前言 如

学习JavaScript中的异步Generator

本文和大家分享的主要是javascript中异步Generator相关内容,一起来看看吧,希望对大家学习javascript 有所帮助. 异步的generators和异步iteration已经到来 ! 这是错误的, 它们现在还在 阶段 3 ,这表示他们很有可能在JavaScript未来的一个版本中发布. 在他们发布之前,你可以通过 Babel 来在你的项目中使用还在阶段3的建议内容. 网站基本上还是一些分散运行的应用,因为任何在语言上的修改都会造成永久的影响,所以所有的未来的版本都需要向后兼容.

【转】C#异步编程及其同步机制

C#异步编程及其同步机制 本篇文章涵盖一下几部分内容: 1. 什么是异步编程,为什么会需要异步编程 2. .NET下的异步编程及其发展 3. .NET线程同步机制及线程间数据封送 4. 异步模式 5. 线程安全及异常处理 6. 线程取消 什么是异步编程,为什么会需要异步编程 这个世界上资源是受限的.但资源限制和懒惰一样促进了工业和科技的发展.在计算机方面举个例子,计算机非得是二进制吗?对计算机来说二进制最好吗?不是,这是由于当时工业水平限制,把电压分成两份表示0和1比分成三份更加方便且可靠:虚拟