JavaScript 实现线程锁
ECMAScript 2018 中增加了 SharedArrayBuffer 和 Atomics ,利用它们可以实现锁(Lock),即页面主线程和 Web Worker 线程间的锁。
SharedArrayBuffer
SharedArrayBuffer(以下简称为SAB) 是一个可以主线程和 Web Worker 线程间共享数据的对象,即同一个 SAB 可以被多个线程读写。
let sab = new SharedArrayBuffer(1024);
worker.postMessage(sab);
SAB 避免了多个线程间为了传递数据而进行数据拷贝,但同时缺引入了经典的数据访问「冲突」:
// 线程A
let sharedBuffer = new SharedArrayBuffer(1024);
let sharedArray = new Int32Array(sab);
let worker = new Worker("browser-worker.js");
worker.postMessage(sab);
sh