gpt4 book ai didi

java - 如何使用 ConcurrentHashMap 执行线程安全的获取然后删除?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:08:18 27 4
gpt4 key购买 nike

在一次采访中,我被要求检查以下代码是否按预期工作。

ConcurrentHashMap<Integer, Integer> chm = new ConcurrentHashMap<>();

if (chm.get(key) != null) {
chm.get(key).doSomething();
chm.remove(key);
}

根据 JavaDocs,get 返回最后完成的更新操作的值。因此,如果线程 1 已经调用了 chm.remove(key) 并且如果线程 2 进入了 if 语句并且即将调用 get 方法,那么我们可能会得到一个异常。这是正确的吗?

我怎样才能使这个线程安全?

最佳答案

Map.remove(key) 返回值,如果它已被删除。这在很多情况下都是一个非常好的技巧,包括您的情况:

Object value = chm.remove(key)
if(value != null)
{
value.doSomething();
}

你不能安全地使用 get 然后 remove,因为如果两个线程同时调用你的方法,那么在 key 完成之前,它们总是有调用 doSomething 两次或更多次的风险已被删除。

如果先删除它,这是不可能的。上面的代码是线程安全的,也更简单。

关于java - 如何使用 ConcurrentHashMap 执行线程安全的获取然后删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34346869/

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