SharedArrayBuffer 是 JavaScript 中支持多线程共享内存的 ArrayBuffer,需配合 Atomics 实现原子操作以避免竞态;仅在跨域隔离(COOP+COEP)环境下可用,且必须通过 postMessage 传输并列入 transfer list。
共享数组缓冲区(SharedArrayBuffer) 是 JavaScript 中一种特殊的 ArrayBuffer,它允许多个执行上下文(比如主线程和 Web Worker)同时访问同一块内存区域,从而实现真正的多线程数据共享。
普通 ArrayBuffer 是“独占”的——一旦被某个视图(如 Int32Array)绑定,就无法被其他线程直接读写。而 SharedArrayBuffer 的底层内存是“可共享的”,配合 Atomics API,能安全地在多个 Worker 之间同步读写,避免竞态条件。
基本流程如下:
new SharedArrayBuffer(byteLength),例如 const sab = new SharedArrayBuffer(1024);
postMessage(sab, [sab]) 传递给 Worker(注意必须显式列入 transfer list)new Int32Array(sab))映射同一块内存直接读写会导致竞争(如两个线程同时递增同一位置),必须用 Atomics 提供的原子操作:
Atomics.add(array, index, value) —— 原子加法,返回旧值Atomics.load(array, index) 和 Atomics.store(array, index, value) —— 安全读写Atomics.wait(array, index, expectedValue, timeout) —— 配合 Atomics.notify() 实现线程等待/唤醒这些操作保证不会被中断,是构建锁、计数器、信号量等同步原语的基础。
SharedArrayBuffer 并非随处可用:
COOP: same-origin 和 COEP: require-corp 响应头)不复杂但容易忽略。