[英]Execution of `remappingFunction` in ConcurrentHashMap.computeIfPresent
[英]Execution of `mappingFunction` in ConcurrentHashMap.computeIfAbsent and ConcurrentHashMap.computeIfPresent
我試圖看到實際的Java文檔,它描述了傳遞給ConcurrentHashMap.computeIfAbsent
和ConcurrentHashMap.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.