共享内存是JavaScript的高级功能,线程(进程的当前执行部分)可以利用共享内存 。 共享内存意味着不必麻烦地在线程之间传递更新的数据,并且所有线程都可以访问和更新共享内存中的相同数据。
听起来不可爱吗? 好吧,差不多。 在本文中,我们将看到如何在JavaScript中使用共享内存以及如何确定这是否是您真正想要的。
共享内存的优缺点
我们使用网络工作者 在JavaScript中创建线程 。 Web Workers API允许我们创建可用于在后台执行代码的工作线程,以便主线程可以自由地继续其执行,并可能处理UI事件,从而确保不冻结UI。
工作线程与主线程并发运行 。 这样同时执行任务的不同部分可以节省时间。 您完成得更快,但是它也有自己的一系列问题。
确保每个线程都获得必要的资源并及时地相互通信本身就是一项任务,其中不幸可能导致令人惊讶的结果。 或者,如果一个线程正在改变数据,另外一个在同一时间阅读它 ,你认为什么其他线程将看到什么? 更新的还是旧的数据?
但是,网络工作者不是很容易搞砸。 在通过消息进行通信的过程中,彼此发送的数据不是原始的而是副本 ,这意味着它们不会共享相同的数据。 它们在需要时相互传递数据副本 。
但是共享很重要,并且多个线程可能还需要同时查看相同的数据并进行更改。 因此, 禁止共享是一个很大的禁忌 。 这是SharedArrayBuffer
对象进入图片的地方。 这将使我们在多个线程之间共享二进制数据 。
而不是在线程之间传递数据副本,而是传递SharedArrayBuffer
对象的副本 。 一个SharedArrayBuffer
对象指向保存数据的内存 。
因此,即使在线程之间传递了SharedArrayBuffer
的副本,它们都仍将指向保存原始数据的同一内存 。 因此,线程可以查看和更新同一内存中的数据 。