簡體   English   中英

瀏覽器的“ localStorage.generator ++”運算符是原子的嗎?

[英]Is browser's “localStorage.generator++” operator atomic?

我想實現一個由瀏覽器的本地存儲支持的唯一ID生成器。 我擔心的是,存儲DOM對象的++運算符未實現為原子運行。

考慮:

function generateUniqueID() {
  if(!localStorage.generator) {
    localStorage.generator = 0;
  }
  return localStorage.generator++;
}

如果此代碼可以在沒有任何並發​​問題的情況下運行並在多個瀏覽器選項卡中生成唯一ID從而破壞了generateUniqueID函數,人們是否可以發表評論?

根據W3C Web存儲建議(請參閱此處 ),第4.5節“線程”:

由於使用了存儲互斥鎖,多個瀏覽上下文將能夠以腳本無法檢測到任何並發腳本執行的方式同時訪問本地存儲區域。

因此,除了腳本本身可以預測的方式之外,在腳本執行期間,存儲對象的length屬性以及該對象的各種屬性的值無法更改。

對我來說,這意味着互斥體位於腳本對localStorage首次訪問(讀取或寫入)上,並且一直保留到該事件循環條目執行返回為止。 實際上,我們在執行鏈的持續時間內可以獨占訪問localStorage

我想像一下,如果使用await/async ,它將破壞執行鏈,並使代碼跨多個事件循環條目執行,從而破壞此合同。 即使源代碼塊看起來是單片的。 謹防。

問題的答案是:是的,只要瀏覽器遵守W3C的建議,所討論的代碼將正確運行。 盡管事實是“測試” if(!localStorage.generator)和“增量” localStorage.generator++位於不同的行中,並且在大多數其他執行環境中不能保證以原子方式執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM