SharedArrayBuffer

Baseline Widely available *

This feature is well established and works across many devices and browser versions. It’s been available across browsers since December 2021.

* Some parts of this feature may have varying levels of support.

Объект SharedArrayBuffer подобен ArrayBuffer, то есть это буфер фиксированной длины, использующийся для хранения любых бинарных данных. Главное отличие SharedArrayBuffer от ArrayBuffer заключается в том, что он используется для создания разделяемой области памяти. В отличие от ArrayBuffer SharedArrayBuffer не может быть откреплён от соответствующей ему области памяти.

Описание

Выделение и совместное использование памяти

Для совместного использования памяти с помощью объекта SharedArrayBuffer между одним агентом в кластере и другим (агентом может быть как основная программа страницы сайта, так и один из её веб-воркеров) используются postMessage и алгоритм структурированного клонирования.

Алгоритм структурированного клонирования принимает SharedArrayBuffers и TypedArrays, отображённый в SharedArrayBuffers. В обоих случаях объект SharedArrayBuffer передаётся получателю, что приводит к появлению нового приватного объекта SharedArrayBuffer внутри агента-получателя (так же как для ArrayBuffer). Оба объекта SharedArrayBuffer ссылаются на один и тот же блок общих данных, и побочный эффект, изменяющий блок данных в одном из агентов, в итоге проявится в другом агенте.

js
var sab = new SharedArrayBuffer(1024);
worker.postMessage(sab);

Обновление и синхронизация разделяемой памяти с помощью атомарных операций

Разделяемую память можно создавать и изменять одновременно в воркерах или основном потоке. В зависимости от системы (ЦПУ, ОС, браузера), распространение изменений по всем контекстам может занять некоторое время. Для синхронизации необходимы атомарные операции .

API, принимающие объекты SharedArrayBuffer

Требования безопасности

Разделяемая память и таймеры высокого разрешения были отключены в начале 2018 года из-за атаки Spectre. В 2020 году был стандартизирован новый, безопасный подход, чтобы включить разделяемую память обратно.

Основное требование — ваш документ должен находиться в безопасном контексте.

Для документов верхнего уровня нужно установить два заголовка, чтобы изолировать ваш сайт от других источников:

  • Cross-Origin-Opener-Policy со значением `same-origin`` (защищает ваш источник от атаки)
  • Cross-Origin-Embedder-Policy со значением require-corp или credentialless (защищает жертв от вашего источника)

Чтобы проверить, что изоляция от других источников прошла успешно, протестируйте свойство crossOriginIsolated, доступное для контекстов окна и воркера:

js
const myWorker = new Worker("worker.js");

if (crossOriginIsolated) {
  const buffer = new SharedArrayBuffer(16);
  myWorker.postMessage(buffer);
} else {
  const buffer = new ArrayBuffer(16);
  myWorker.postMessage(buffer);
}

Спецификации

Specification
ECMAScript® 2025 Language Specification
# sec-sharedarraybuffer-objects

Совместимость с браузерами

Report problems with this compatibility data on GitHub
desktopmobileserver
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Deno
Node.js
SharedArrayBuffer
[Symbol.species]
SharedArrayBuffer() constructor
maxByteLength option
byteLength
grow
growable
maxByteLength
slice

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support
No support
No support

Смотрите также