SharedArrayBuffer 与 Atomics 边界
本节先区分普通 ArrayBuffer 的复制与 SharedArrayBuffer 的共享,再用 Atomics 建立确定的计数结果。
js
if (crossOriginIsolated && typeof SharedArrayBuffer !== 'undefined') {
const shared = new SharedArrayBuffer(4)
const counter = new Int32Array(shared)
console.log('shared', Atomics.add(counter, 0, 1), Atomics.load(counter, 0))
} else {
const copy = new ArrayBuffer(4)
console.log('fallback', new Int32Array(copy)[0])
}普通页面会明确打印 fallback;配置了 COOP/COEP 并通过 crossOriginIsolated 检查后才进入共享内存路径。
机制拆解
SharedArrayBuffer 允许 Worker 共享同一内存,Atomics 提供读写和等待的同步边界。它需要 cross-origin isolation;没有该条件时应走消息复制或普通 ArrayBuffer 降级,不能假设所有页面都能构造共享缓冲区。
边界与失败路径
- 所有权:监听器、observer、worker、连接、缓存和焦点都有创建者与释放时机;页面隐藏、路由离开和元素移除时都要验证。
- 宿主差异:SSR、Web Worker、Shadow DOM、跨文档、跨源和辅助技术不会共享同一套全局对象与事件路径。
- 错误分类:取消、超时、权限拒绝、协议错误、配额不足和浏览器不支持应分别进入可观察状态。
- 安全边界:用户输入、URL、HTML、消息和持久化数据不能仅因为来自同源或类型正确就视为可信。
可运行实验
在 cross-origin isolated 页面创建共享计数器并交给 Worker 递增;在普通页面重复实验,记录构造失败并实现 postMessage 的复制降级。
实验记录要包含运行时、输入步骤、预期输出、实际日志和未覆盖的宿主差异。
练习
- 在 cross-origin isolated 页面让两个 Worker 递增同一计数器,断言最终值等于总次数。
- 在未隔离页面记录构造失败,并实现 postMessage 的复制回退。
- 解释 Atomics 解决什么竞态,不能解决什么业务取消问题。 查看本节答案
下一步
完成练习后回到本章概览,按下一篇继续;遇到跨章节故障,先回到本节的所有权与宿主边界。