Array的push与pop操作是否为原子操作?webworker下arr.length判断是否准确?
解答
Array的push、pop是否属于原子操作
- 单线程场景下:JS执行时同一时间仅会运行一个上下文内的代码,
push()、pop()作为标准内置方法,执行过程不会被同线程的其他JS代码打断,操作完成后数组length会同步更新,属于原子操作。 - 跨线程共享内存场景下:如果数组基于
SharedArrayBuffer实现,普通的push()、pop()不属于线程安全的原子操作,不同线程的读写操作会存在竞态条件,操作过程可能被其他线程的执行逻辑打断。
arr.length === 0的判断是否总能返回正确结果
需要结合数组使用场景判断:
- 如果使用普通数组(非共享内存):WebWorker和主线程的通信默认采用结构化克隆机制,传递的数组是独立副本,两边不存在同时修改同一份数组的可能。只要当前线程内不存在在判断前修改数组的异步逻辑,
arr.length === 0的判断结果完全正确。 - 如果使用基于
SharedArrayBuffer的共享数组:直接读取length属性不属于原子读取操作,可能读到其他线程修改过程中的中间值,判断结果不可靠。这种场景需要调用Atomics系列的原子读写方法操作共享内存,才能保证取值正确。
内容的提问来源于stack exchange,提问作者JosephConrad
相关产品推荐
相关产品推荐

