1 回答

TA貢獻(xiàn)1805條經(jīng)驗 獲得超9個贊
我認(rèn)為您可以ConcurrentHashMap::computeIfPresent
在這種情況下使用假設(shè)相同的List
實(shí)例沒有放置相同的鍵:
CompletableFuture.runAsync(() -> {
? ? clients.computeIfPresent(client.getName(), (name, clients1) -> {
? ? ? ? List<Client> currentClients = new ArrayList<>(clients1);
? ? ? ? currentClients.remove(client);
? ? ? ? return currentClients.isEmpty() ? null : currentClients;
? ? });
});
由于computeIfPresent是原子執(zhí)行的,并且我們在 remappingFunction 中使用列表的副本 - 它應(yīng)該可以工作。
正如我們在文檔中可以讀到的:
如果指定鍵的值存在,則嘗試計算給定鍵及其當(dāng)前映射值的新映射。整個方法調(diào)用都是原子執(zhí)行的。當(dāng)計算正在進(jìn)行時,其他線程對此映射的某些嘗試更新操作可能會被阻止,因此計算應(yīng)該簡短且簡單,并且不得嘗試更新此映射的任何其他映射。
添加回答
舉報