目录
一、Atomics和SharedArrayBuffer
二、原子操作基础
1、算术及位操作方法
Atomics API 提供了一套简单的方法用于执行就地修改操作。在ECMA规范中,这些方法被定义为AtomicReadModifyWrite操作。在底层,这些方法都会从SharedArrayBuffer中某个位置读取值,然后执行算术和位操作,最后再把计算结果写到相同的位置。这些操作的原子本质意味着上述读取、修改、写回操作会按顺序执行,不会被其它线程中断。
//创建大小为1的缓冲区 let sharedArrayBuffer = new SharedArrayBuffer(1); //基于缓冲创建Unit8Array let typedArray = new Unit8Array(sharedArrayBuffer); //所有ArrayBuffer全部初始化为0 console.log(typedArray);//Unit8Array[0] //对索引0处的值执行原子加10 Atomics.add(typedArray,0,10);//Unit8Array[10] //对索引0处的值执行原子减10 Atomics.sub(typedArray,0,10);//Unit8Array[0]
2、原子读和写
- 所有原子指令相互之间的顺序永远不会重排。
- 使用原子读或原子写保证所有指令都不会相对原子读写重新排序。
除了读写缓冲区的值,Atomics.load()和Atomics.store()还可以构建“代码围栏”。JavaScript引擎保证非原子指令可以相对于load()和store()本地重排,但这个重排不会侵犯原子读写的边界。
const sharedArrayBuffer = new SharedArrayBuffer(4); const view = new Unit32Array(sharedArrayBuffer); //执行非原子写 view[0] = 1; //非原子写可以保证在这个读操作之前完成,因此这里一定会读到1 console.log(Atomics.load(view,0));//1 //执行原子写 Atomics.store(view,0,2); //非原子读可以保证在原子写完成后发生,这里一定会读到2 console.log(view[0]);//2
3、原子交换
为了保证连续、不间断的先读后写,Atomics API 提供了两种方法:exchange()和compareExchange()。Atomics.exchange()执行简单的交换,以保证其他线程不会中断值得交换。
const sharedArrayBuffer = new SharedArrayBuffer(4); const view = new Unit32Array(sharedArrayBuffer); //在索引0处写入10 Atomics.store(view,0,10); //从索引0处读取值,然后在索引0处写入5 console.log(Atomics.exchange(view,0,5));//10 //从索引0处读取值 console.log(Atomics.load(view,0));//5
在多线程程序中,一个线程可能只希望在上次读取某个值之后没有其他线程修改该值得情况下对共享缓冲区执行写操作。如果这个值没有被修改,这个线程就可以安全地写入更新后的值:如果这个值被修改了,那么执行写操作将会破坏其他线程计算的值。对于这种任务,Atomics API提供了compare-Exchange()方法。这个方法只在目标索引处的值与预期值匹配时才会执行写操作。
4、原子Futex操作与加锁
三、跨上下文消息
跨文档消息,有时候也称XDM(cross-document messaging),是一种在不同执行上下文(例如不同工作线程或不同源的页面)间传递信息的能力。
四、Encoding API
Encoding API主要用于实现字符串与定型数组之间的转换。
五、File API和Blob API
1、File类型
File API仍然以表单中的文件输入字段为基础,但是增加了直接访问文件信息的能力。HTML5在DOM上为文件输入元素增加了files集合。当用户在文件字段中选择一个或多个文件时,这个files集合中会包含一组File对象,表示被选中的文件,每个File对象都有一些只读属性。
2、FileReader类型
FileReader类型表示一种异步文件读取机制,可以把FileReader想象成类似于XMLHttpRequest,只不过用于从文件系统读取文件,而不是从服务器读取数据。FileReader类型提供了几个读取文件数据的方法。
- readAsText(file,encoding);//从文件中读取纯文本内容并保存在result属性中
- readAsDataURL(file);//读取文件并将内容的数据URI保存在result属性中
- readAsBinaryString(file);//读取文件并将每个字符的二进制数据保存在result属性中
- readAsArrayBuffer(file);//读取文件并将文件内容以ArrayBuffer形式保存在result属性中
3、FileReaderSync类型
FileReader类型的同步版本。
4、Blob与部分读取
六、Streams API
1、应用场景
Streams API 是为了解决一个简单但又很基础的问题而生的:Web应用如何消费有序的小信息块而不是大块信息?这种能力主要有两种应用场景。
- 大块数据可能不会一次性都可用。网络请求的响应就是一个典型的例子。网络负载是以连续信息包形式交付的,而流式处理可以让应用在数据一到达就能使用,而不必等到所有数据都加载完毕。
- 大块数据可能需要分小部分处理。视频处理、数据压缩、图像编码和JSON解析都是可以分成小部分进行处理,而不必等到所有数据都在内存中再处理的例子。
2、理解流
Streams API定义了三种流:
- 可读流:可以通过某个公共接口读取数据块的流。数据在内部从底层源进入流,然后由消费者consumer进行处理。
- 可写流:可以通过某个公共接口写入数据块的流。生产者(consumer)将数据写入流,数据在内部传入底层数据槽(sink)。
- 转换流:由两种流组成,可写流用于接收数据,可读流用于输出数据。这两个流质检是转换程序(transformer),可以根据需要检查和修改流内容。
七、Web Cryptography API
八、JavaScript知识体系合集
九、JavaScript思维导图

十、关注公众号哪吒编程,回复1024,获取Java学习资料,还有不定期的送书活动
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/202411.html原文链接:https://javaforall.net
