下面的计数器线程安全吗?我认为,如果我通过异步功能达到同步功能,则计数器会正常工作。我对吗?我的解释是函数a()是同步函数。这意味着该函数是原子的,这就是为什么只有一个进程在其中起作用的原因。这还意味着计数器安全地增加了吗?
`var counter = 0;
function a(){
counter++
}
async function count(){
//IO code;
a();
}
count();`
答案 0 :(得分:1)
是的,代码是线程安全的。大多数值(SharedArrayBuffers除外)无法在线程之间共享,因此不能由两个不同的线程同时访问。
正如您提到的“异步函数”:它们异步运行是指它们可能在指定的点处停止(基本上在您await
时),然后可能会运行其他代码,但是所有其他代码将一直运行到完成(因此,其他代码可能仅在使用await
时才在它们之间运行)。
可能会失败的同一操作的示例:
counter = counter + await Promise.resolve(1);
这可能会失败,因为counter
得到了评估,诺言得到了await
,与此同时其他代码也可能改变了counter
,然后又分配回了counter