sharedarraybuffer需跨域隔离环境才能使用,必须设置coep和coop响应头并走http(s)协议;传递时需用transfer list而非结构化克隆;读写须通过atomics原子操作,不可直接访问视图属性。

SharedArrayBuffer 在 HTML 中根本不能直接用
浏览器出于安全考虑,从 Chrome 92 起默认禁用 SharedArrayBuffer,除非页面满足跨域隔离(cross-origin isolation)要求。单纯在 HTML 文件里写 new SharedArrayBuffer(1024) 会直接抛错:SharedArrayBuffer is not supported in the current context 或 SharedArrayBuffer is not defined。
这不是代码写得不对,而是环境没达标。不解决跨域隔离,后续所有多线程共享逻辑都跑不起来。
- 必须同时设置两个响应头:
Cross-Origin-Embedder-Policy: require-corp和Cross-Origin-Opener-Policy: same-origin - 本地
file://协议绝对不行,必须走http://或https://(哪怕本地起个python3 -m http.server) - 如果用 iframe 加载子资源,子页面也得带同样响应头,否则主页面的
SharedArrayBuffer仍不可用
Worker 里怎么正确创建和传递 SharedArrayBuffer
SharedArrayBuffer 本身不能被结构化克隆(structured clone),所以不能直接用 postMessage() 发送原始实例——必须显式传 buffer 字段,并在接收端重新构造视图。
常见错误是这样写:
worker.postMessage({ buf: new SharedArrayBuffer(1024) }); // ❌ 报错:DataCloneError
正确做法是:
- 主线程创建
sab = new SharedArrayBuffer(1024) - 用
postMessage(sab, [sab])—— 第二个参数是 transfer list,表示把所有权移交过去 - Worker 收到后,用
new Int32Array(event.data)或其他视图包装它(不能用new Int32Array(sab),因为 event.data 已是 buffer)
注意:一旦 transfer,原主线程就无法再访问该 SharedArrayBuffer,除非再传回来。
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
用 Atomics 实现线程安全读写,不是靠“加锁”
Atomics 不是提供互斥锁(mutex),而是提供原子操作原语,比如 Atomics.add()、Atomics.wait()、Atomics.notify()。它依赖的是底层内存模型保证,不是 JS 层模拟。
典型误用:
const arr = new Int32Array(sab);<br>arr[0] = 1; // ❌ 非原子写入,可能被 Worker 并发覆盖
应改为:
- 写:用
Atomics.store(arr, 0, 1)或Atomics.add(arr, 0, 1) - 读:用
Atomics.load(arr, 0),而不是arr[0] - 等待变更:用
Atomics.wait(arr, 0, expectedValue)(需配合Atomics.notify()) -
Atomics.wait()只对Int32Array和BigInt64Array有效,其他类型会静默失败
为什么 SharedArrayBuffer + Atomics 仍然容易出错
问题不在 API 复杂,而在于它打破了 JS 单线程心智模型——你得自己管理内存可见性、竞态条件和唤醒丢失。
几个真实踩坑点:
- 忘了调
Atomics.notify(),导致Atomics.wait()永远挂起 - 用
setTimeout模拟轮询替代wait/notify,结果 CPU 疯涨且延迟不可控 - 在非
SharedArrayBuffer创建的视图上用Atomics,比如new Int32Array(new ArrayBuffer(1024)),调用Atomics.load()会静默返回 0 - 多个 Worker 同时写同一位置但没用
Atomics.compareExchange()做 CAS,结果值被覆盖丢失
真正难的从来不是“怎么写”,而是“怎么证明这段并发逻辑在所有边界条件下都正确”。SharedArrayBuffer 是把责任交还给开发者,不是提供一个开箱即用的多线程方案。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










