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

标签 java multithreading java-memory-model

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/

相关文章:

java - 在Java中使用基于双重检查锁定的单例是否安全?

java - 如何从 ListView(或 TableView)中删除边框?

c++ - C++ 11中与std::atomic的同步

c++ - 保持活跃的线程 (Qt)

java - 如何了解调试期间哪个线程正在创建新变量?

java - 线程中的每个操作都发生在该线程中按程序顺序稍后出现的每个操作之前

java - XPage:递归创建 JSON 字符串

java - 如何使用 ->(箭头)运算符?

java - 带有 PathVariable 的 API 的 XML 响应

scala - Scala 构造函数上的“发生在”之前 : final fields