atomics对象专为sharedarraybuffer设计,不可用于普通arraybuffer;必须通过postmessage共享同一sharedarraybuffer实例,配合int32array等视图使用原子操作,且需跨域隔离环境。

HTML5 中的 Atomics 对象专为多线程(Web Worker)环境下安全操作共享内存(SharedArrayBuffer)而设计,但它**不能直接用于普通 ArrayBuffer**。关键前提:原子操作必须基于 SharedArrayBuffer 及其视图(如 Int32Array),而非普通 ArrayBuffer。
为什么 Atomics 要求 SharedArrayBuffer?
普通 ArrayBuffer 是独占的,每个 Worker 拥有自己副本,修改不会影响其他线程;而 SharedArrayBuffer 在多个 Worker 间共享同一块内存,存在竞态风险。Atomics 提供的原子读写、等待/唤醒、加减等操作,只有在共享内存上才有意义和效果。
- 尝试对普通
ArrayBuffer创建的视图调用Atomics.add()会抛出TypeError(“not a shared array buffer”) - 浏览器强制检查底层缓冲区是否为
SharedArrayBuffer,否则拒绝执行原子操作
正确使用 Atomics 的基本步骤
需配合 SharedArrayBuffer 和类型化数组视图,且确保跨 Worker 共享同一缓冲区实例:
将 Markdown 文章转换为微信公众号兼容的纯 HTML 格式。当用户要求"转成微信格式"、"生成公众号文章 HTML"、"排版到微信草稿箱"、"微信粘贴格式"时触发。输出带内联样式的纯 HTML,微信编辑器可直接渲染,无需额外适配。支持标题、段落、列表、粗体、行内代码、表格、引用块、代码块、配图的完整转换。
- 主线程创建
new SharedArrayBuffer(1024),并通过postMessage(..., [sab])传递给 Worker - Worker 接收后,用它构造视图:
const ia = new Int32Array(sharedBuf) - 调用原子操作,例如:
Atomics.add(ia, 0, 1)—— 安全地对索引 0 处的 32 位整数加 1 - 所有操作均以视图元素为单位(如
Int32Array的每个元素是 4 字节),不支持字节级或非对齐访问
常用 Atomics 方法与注意事项
核心方法均接受(视图、索引、值)参数,部分含返回值或额外语义:
-
Atomics.load(view, index):原子读取,返回当前值 -
Atomics.store(view, index, value):原子写入,返回写入值 -
Atomics.add(view, index, value):原子加法,返回更新前的值 -
Atomics.compareExchange(view, index, oldVal, newVal):CAS 操作,成功返回旧值,失败也返回当前实际值 -
Atomics.wait(view, index, value, timeout):阻塞当前 Worker,直到该位置值变化(需配合Atomics.notify())
注意:wait/notify 仅适用于 Int32Array 视图,且要求值为整数;超时单位为毫秒,可省略(默认无限等待)。
安全边界与常见陷阱
Atomics 不提供锁或高级同步原语,开发者需自行设计协议:
- 避免混合使用原子与非原子操作:对同一内存位置,不可一边用
ia[0] = 5(非原子),一边用Atomics.add(ia, 0, 1)(原子) - 视图类型必须匹配数据语义:写入
Int32Array的位置,不能用Float64Array读取,否则结果未定义 - 浏览器需启用跨域隔离(
cross-origin-isolated状态),否则SharedArrayBuffer构造会失败(受 Spectre 缓解策略限制) - 并非所有浏览器默认开启:需检查
typeof SharedArrayBuffer !== 'undefined'和crossOriginIsolated状态
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










