在 Web Worker 中使用 SharedArrayBuffer 实现共享内存需启用跨域隔离(设置 COEP/COOP 响应头并验证 self.crossOriginIsolated),主线程通过 transfer list 传递 SharedArrayBuffer,Worker 用 Atomics 安全读写,禁用直接赋值,Safari 不支持。

在 Web Worker 中使用 SharedArrayBuffer 实现主线程与 Worker 之间的共享内存是可行的,但需满足严格的安全前提,且必须配合 Atomics 进行同步操作,否则会引发竞态或被浏览器直接拒绝。
必须开启跨域隔离(Cross-Origin Isolation)
现代浏览器(Chrome 92+、Firefox 93+ 等)强制要求页面启用跨域隔离,才能创建和传递 SharedArrayBuffer。否则 SharedArrayBuffer 构造函数会返回 undefined 或抛出异常。
- 服务器需返回两个关键响应头:
Cross-Origin-Embedder-Policy: require-corpCross-Origin-Opener-Policy: same-origin- 前端可通过
self.crossOriginIsolated检查是否生效:if (!self.crossOriginIsolated) console.error("未启用跨域隔离,SharedArrayBuffer 不可用");
主线程创建并传递 SharedArrayBuffer
主线程负责分配共享内存,并通过 postMessage 以转移方式(transfer list)传给 Worker,避免拷贝。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 创建示例:
const sab = new SharedArrayBuffer(1024); // 1KB 共享内存 - 传递给 Worker(注意:必须用 transfer list):
worker.postMessage({ type: 'init', buffer: sab }, [sab]); - ⚠️ 不写
[sab]就不会真正共享,Worker 收到的是普通 ArrayBuffer(只读副本)
Worker 中接收并使用 SharedArrayBuffer
Worker 接收后,可基于 SharedArrayBuffer 创建视图(如 Int32Array),并通过 Atomics 安全读写。
- 在 Worker 内接收:
self.onmessage = ({ data }) => {<br> if (data.type === 'init') {<br> const view = new Int32Array(data.buffer);<br> // 初始化第一个值<br> Atomics.store(view, 0, 42);<br> }<br>}; - 读写必须用
Atomics.load()/Atomics.store(),不能直接view[0] = 123(虽不报错但不保证原子性) - 如需等待/通知机制,可用
Atomics.wait()和Atomics.notify()实现线程间信号同步
常见陷阱与注意事项
实际使用中容易踩坑,尤其在调试阶段。
-
SharedArrayBuffer无法序列化,不能放在普通postMessage数据体中(只能走 transfer list) - 同一
SharedArrayBuffer的多个视图(如Int32Array和Float64Array)可共存,但需确保内存对齐,否则行为未定义 - 不支持 Safari(截至 2024 年仍禁用
SharedArrayBuffer),需降级方案(如频繁postMessage+Transferable数组) - 调试时可用
Atomics.peek()(非标准但 Chrome 支持)快速查看当前值,但不可用于生产逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










