单线程和异步的概念和关系

374 阅读3分钟

单线程和异步的关系和概念

一、什么是单线程

一个线程,同时只能做一件事

进程:是 cpu 分配资源的最小单位;(是能拥有资源和独立运行的最小单位)

线程:是 cpu 调度的最小单位;(线程是建立在进程的基础上的一次程序运行单位,一个进程中可以有多个线程)

二、 JavaScript 为什么是单线程

线程安全

线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。

浏览器需要根据 DOM 进行渲染, 而 JS 可以更改 DOM 结构,所以 JS 执行的时候,浏览器 DOM 渲染会暂停,如果 js 是多线程的,两段 JS 同时执行(因为如果都修改 DOM 就冲突了,浏览器不知道该修改哪一个),无法保证各个线程正常且正确的执行。

在 HTML5 种提出Web Worker标准,允许JavaScript脚本创建多个线程,但是不能访问 DOM。

三、什么是异步

同步: 当前操作执行完,才能进行下一个操作。如:我要吃火锅,我先烧水,水烧开了我再去洗菜

异步:不等待当前操作执行完,直接进行下一个操作。如:我要吃火锅,我把水烧上,在烧水这个过程中去洗菜,不等水烧开

是否等待上一个任务执行完,再去执行下一个任务

四、JavaScript 为什么是异步执行

因为 JS 单线程,代码是一行一行执行的,而 JS 执行的时候,浏览器 DOM 渲染会暂停,如果是同步执行的话,遇到耗时操作的,那就要等待这个操作执行结束再进行下一个操作,这样就会造成页面卡顿,长时间无响应等,影响用户体验。

所以 JS 的耗时操作(如:定时器、Ajax请求等)都是异步执行,其它操作是同步执行的,每当遇到耗时操作就会记录下来(会等待耗时结束后,将异步函数放入异步队列),不等待这个操作执行完,直接执行一个操作,等待同步操作执行完,就会发起事件轮询,检查异步队列是否为空,如果不为空,就会执行里面的操作

五、异步和单线程的关系

异步是 JS 单线程的解决方案