簡體   English   中英

在ConcurrentHashMap.computeIfAbsent和ConcurrentHashMap.computeIfPresent中執行`mappingFunction`

[英]Execution of `mappingFunction` in ConcurrentHashMap.computeIfAbsent and ConcurrentHashMap.computeIfPresent

我試圖看到實際的Java文檔,它描述了傳遞給ConcurrentHashMap.computeIfAbsentConcurrentHashMap.computeIfPresent方法時可以調用mappingFunction次數的行為。

ConcurrentHashMap.computeIfAbsent的Javadoc似乎很清楚,表示mappingFunction最多只執行一次:

ConcurrentHashMap.computeIfAbsent Javadoc

如果指定的鍵尚未與值關聯,則嘗試使用給定的映射函數計算其值,並將其輸入此映射,除非為null。 整個方法調用是以原子方式執行的, 因此每個鍵最多應用一次該函數 其他線程在此映射上的某些嘗試更新操作可能在計算進行時被阻止,因此計算應該簡短,並且不得嘗試更新此映射的任何其他映射。

但是ConcurrentHashMap.computeIfPresent的Javadoc並沒有說明可以執行mappingFunction次數:

ConcurrentHashMap.computeIfPresent Javadoc

如果存在指定鍵的值,則嘗試在給定鍵及其當前映射值的情況下計算新映射。 整個方法調用以原子方式執行。 其他線程在此映射上的某些嘗試更新操作可能在計算進行時被阻止,因此計算應該簡短,並且不得嘗試更新此映射的任何其他映射。

通過查看源代碼,他們看起來就像mappingFunction最多只執行一次。 但我真的希望看到保證這種行為的實際文檔。

有這樣的文件嗎?

ConcurrentMap#computeIfPresent的文檔中,我們看到以下內容:

默認實現等效於對此映射執行以下步驟:

for (V oldValue; (oldValue = map.get(key)) != null; ) {
    V newValue = remappingFunction.apply(key, oldValue);
    if ((newValue == null)
        ? map.remove(key, oldValue)
        : map.replace(key, oldValue, newValue))
     return newValue;
 }
 return null;

盡管文檔沒有明確說明重映射功能只會執行一次,但文檔提供的等效代碼卻清楚了。

注意 :請記住:

當多個線程嘗試更新時, 可以多次調用映射操作和重映射功能

(強調我的)

暫無
暫無

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

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