我正在使用 JAVA 8 并嘗試修改最終地圖,問題是地圖正在為實時轉換邏輯提供服務,所以如果我嘗試清除它然后修改它,將會有一些丟失的轉換
private final Map<String, Set<EventMapping>> registeredEvents = new ConcurrentHashMap<>();
Map<String, Set<EventMapping>> newRegisteredEntries = eventMappingDBWrapper.getActiveEventMapping();
if (MapUtils.isNotEmpty(newRegisteredEntries)) {
registeredEvents.clear();
registeredEvents.putAll(newRegisteredEntries);
}
我擔心的是,如果我呼叫clear()然后 map 將是空的,直到putAll()在下一行呼叫,同時如果某些事件需要獲取這些映射,它將產生問題,因為我們每分鐘處理 1M 事件。
有什么方法可以安全地執行它嗎?
uj5u.com熱心網友回復:
如果更改必須在關鍵區域以原子方式發生,盡管不會阻塞讀取,您將需要一個特殊的資料結構。
但是,以下可能會做:
if (MapUtils.isNotEmpty(newRegisteredEntries)) {
Set<String> oldKeys = new HashSet<>(registeredEvents.keySet());
oldKeys.removeAll(newRegisteredEntries.keySet());
registeredEvents.putAll(newRegisteredEntries);
oldKeys.forEach(registeredEvents::remove);
}
一個變化將是oldKeys之后填充。
這仍然有一個巨大的缺點:并發寫入,比如兩次呼叫這個函式會引入一些垃圾。此外,更改不是原子的,在幾個鍵上組合轉換可能會導致舊的轉換和一個轉換混合。
如果您需要更好的并發行為 ( java.util.concurrent),請確定您的需求,先撰寫 API 方法,然后查看實作。通過精心安排的多重更改,其中幾個鍵的映射值屬于一起,您可能會想到版本號之類的東西。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/525398.html
標籤:爪哇最后并发哈希图
上一篇:流中謂詞的通配符通用型別不適用
