gpt4 book ai didi

java - 在删除之前从 ConcurrentHashMap 窃取引用。正确性

转载 作者:行者123 更新时间:2023-11-30 10:10:59 25 4
gpt4 key购买 nike

ConcurrentHashMap 没有公开有条件地删除元素并获取它的可能性。所以,我自己实现它:

private final ConcurrentHashMap<UUID, MyClass> map = new ConcurrentHashMap<>();

public MyClass removeIfAndGet(UUID key){
final MyClass[] arr = new MyClass[1];

return map.computeIfPresent(key, (x, v) -> {
if(v.isDone()){ // MyClass::isDone is thread-safe
arr[0] = v; // let's capture (steal) it!
return null; // let's remove it from a map!
}
return v; // v does not satisfy our requirement, don't remove that.
});
}

还好吗?我有一些疑问,因为在删除它之前“窃取”引用不是很好。它是否安全和正确(在多线程方面也是如此?)。是的,我知道 MyClass 本身必须是线程安全的。

附言我可以做得更好吗?

最佳答案

为什么不通过覆盖 computeIfPresent() 方法创建自己的 ConcurrentHashMap 实现,并让它检索当前映射(如果有)。然后,调用 super 实现(调用父级的 computeIfPresent 方法),如果它返回 null,则返回您检索到的映射。

可以上how computeIfPresent is implemented看看,并在您自己的 computeIfPresent 方法中执行类似的操作,但返回您想要的内容。它仍然可以是线程安全的。

关于java - 在删除之前从 ConcurrentHashMap 窃取引用。正确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52642802/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com