This page was translated from English by the community.Learn more and join the MDN Web Docs community.
SharedArrayBuffer
Baseline Widely available *
This feature is well established and works across many devices and browser versions. It’s been available across browsers since декабрь 2021 г..
* Some parts of this feature may have varying levels of support.
ОбъектSharedArrayBuffer подобен ArrayBuffer, то есть это буфер фиксированной длины, использующийся для хранения любых бинарных данных. Главное отличиеSharedArrayBuffer отArrayBuffer заключается в том, что он используется для создания разделяемой области памяти. В отличие отArrayBufferSharedArrayBuffer не может быть откреплён от соответствующей ему области памяти.
In this article
Описание
>Выделение и совместное использование памяти
Для совместного использования памяти с помощью объектаSharedArrayBuffer между одним агентом в кластере и другим (агентом может быть как основная программа страницы сайта, так и один из её веб-воркеров) используютсяpostMessage иалгоритм структурированного клонирования.
Алгоритм структурированного клонирования принимаетSharedArrayBuffers иTypedArrays, отображённый вSharedArrayBuffers. В обоих случаях объектSharedArrayBuffer передаётся получателю, что приводит к появлению нового приватного объекта SharedArrayBuffer внутри агента-получателя (так же как дляArrayBuffer). Оба объектаSharedArrayBuffer ссылаются на один и тот же блок общих данных, и побочный эффект, изменяющий блок данных в одном из агентов, в итоге проявится в другом агенте.
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, доступное для контекстов окна и воркера:
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® 2026 Language Specification> # sec-sharedarraybuffer-objects> |
Совместимость с браузерами
Смотрите также
AtomicsArrayBuffer- JavaScript typed arrays guide
- Web Workers
- Shared Memory – a brief tutorial in the TC39 ecmascript-sharedmem proposal
- A Taste of JavaScript's New Parallel Primitives on hacks.mozilla.org (2016)
- COOP and COEP explained by the Chrome team (2020)
Cross-Origin-Opener-PolicyCross-Origin-Embedder-PolicyCross-Origin-Resource-PolicycrossOriginIsolated- SharedArrayBuffer updates in Android Chrome 88 and Desktop Chrome 92 on developer.chrome.com (2021)