相关文章推荐
睡不着的抽屉  ·  JavaScript实战 - ...·  3 周前    · 
严肃的香菇  ·  windows系统部署yolov5 - ...·  9 月前    · 
有腹肌的竹笋  ·  MySQL 连接器 6.7.4 和 ...·  1 年前    · 
千杯不醉的黑框眼镜  ·  QListWidget - ...·  1 年前    · 

作者: 逍遥Sean
简介:一个主修Java的Web网站\游戏服务器后端开发者
主页: https://blog.csdn.net/Ureliable
觉得博主文章不错的话,可以三连支持一下~ 如有需要我的支持,请私信或评论留言!

当涉及到 JavaScript 中的线程锁时,我们需要理解 JavaScript 是单线程执行的,它通过事件循环来处理异步操作,而不像传统多线程语言那样有真正的线程概念。因此,在 JavaScript 中模拟线程锁实际上是在管理异步操作的顺序和并发。

1. 理解 JavaScript 的单线程模型

JavaScript 在浏览器中是单线程执行的,这意味着它一次只能处理一个任务。异步操作通过事件循环(Event Loop)和回调函数来实现非阻塞的异步编程模型。

2. 使用 Promise 链式调用实现锁

在 JavaScript 中,我们可以使用 Promise 链式调用来模拟线程锁的效果。Promise 是一种表示异步操作完成或失败的对象。

实现步骤:
  • 创建一个初始状态为 resolved 的 Promise 对象作为锁。
  • 每次需要锁定的操作,都通过 then() 方法串联起来,确保操作按顺序执行。
  • 当一个操作完成后,返回一个新的 resolved 状态的 Promise 对象,以解锁并允许下一个操作执行。
let lock = Promise.resolve(); // 初始状态的 Promise
function lockedOperation() {
    lock = lock.then(() => {
        // 这里是需要锁定的操作
        console.log("Locked operation");
        // 操作完成后返回一个 resolved 状态的 Promise
        return Promise.resolve();
    });
// 测试
lockedOperation(); // 第一个操作
lockedOperation(); // 第二个操作,会等待第一个操作完成后执行
示例解析:
  • lock 是一个 Promise 对象,通过 then() 方法链式调用确保操作顺序执行。
  • 每次调用 lockedOperation() 时,它会等待之前的操作完成后再执行。
  • 这种方法适用于需要确保某些操作按照顺序执行的场景,比如处理并发请求时的顺序性要求。

3. 使用 async/await 实现锁

另一种更现代化和简洁的方法是使用 async 函数和 await 关键字。

let lock = Promise.resolve(); // 初始状态的 Promise
async function lockedOperation() {
    await lock; // 等待上一个操作完成
    // 这里是需要锁定的操作
    console.log("Locked operation");
    // 操作完成后返回一个 resolved 状态的 Promise
    lock = Promise.resolve();
// 测试
lockedOperation(); // 第一个操作
lockedOperation(); // 第二个操作,会等待第一个操作完成后执行
示例解析:
  • async function 定义了一个异步函数 lockedOperation()
  • await lock; 表示等待当前 lock Promise 对象完成,保证了操作的顺序性。
  • 每次操作完成后,将 lock 重新赋值为 resolved 状态的 Promise,以允许下一个操作执行。

虽然 JavaScript 并不支持传统意义上的线程和线程锁,但通过 Promise 链式调用或 async/await 语法,我们能够有效地管理异步操作的顺序性,避免竞态条件和并发问题。这种模式特别适合需要保证操作顺序的场景,如处理网络请求、文件操作等异步任务。

通过这篇文章,你现在应该能够理解如何在 JavaScript 中模拟线程锁的概念,并能够应用到实际开发中处理复杂的异步流程。

JavaScript 实现线程锁 ECMAScript 2018 中增加了 SharedArrayBuffer 和 Atomics ,利用它们可以实现锁(Lock),即页面主线程和 Web Worker 线程间的锁。 SharedArrayBuffer SharedArrayBuffer(以下简称为SAB) 是一个可以主线程和 Web W...
问题描述: 最近,在uniapp上实现一个页面功能,需要在onReady之后获取canvasContext进行绘制,但是里面用到的一些参数,需要在onLoad上进行传参拿到,由于不同的手机,渲染速度不同,因此导致 onReady 与 onLoad 的执行先后顺序不确定,从而影响到后面的功能操作。 解决方案: 在后端,我们会想到直接使用锁来解决这个问题。但在JavaScript里面,是没有多线程的,因此也就不存在锁。在这里,我使用Promise实现锁。 Lock.js
【青云交】华为云云享专家,在技术圈个人影响力位居前 17,跻身博客之星 TOP23。在同一天荣登三榜(领军人物、原力榜和作者周榜)榜首,苏州地区各榜也统统拿下榜首之位,实力爆棚! 09-21 $(document).ready(function(){ var lock =false;//锁作为全局变量 $("#submit").on('click',function(){ //如果用户提交了一次,lock被置为true,锁开启。后续在锁被关闭之前,用户都不能提交数据。 if(lock) //锁已经开启,在提交只会被阻断 return false; 这个和节流、防抖功能不一样,节流防抖会丢弃掉中间的请求,中间的请求获取不到返回值 很容易想到使用同步非阻塞方案,在第一个点击时,进入loading状态,之后的点击判断loading就等50毫秒继续检查loading的值,直到loading为false,返回localEnv <input onclick="clickMe()" t