gpt4 book ai didi

java - 从 ConcurrentMap.remove() 获取键是否存在

转载 作者:行者123 更新时间:2023-11-30 11:48:34 26 4
gpt4 key购买 nike

在 Java 的 ConcurrentMap 中, 有 remove(key, expectedValue) ,这将返回以下之一:

  • 预期值在那里,但已被删除。
  • 预期值不存在,因此未被删除。

但我想要得到的是其中之一:

  1. 预期值在那里,但已被删除。
  2. 该键下有一个值,但不是预期的值,因此尚未删除。
  3. 该键下没有值,因此尚未删除。

如何以并发和线程安全的方式获取此信息?


这是我要验证的代码

// attempt to remove the old session...
if (!sessions.remove(player.getId(), existing)) {
// it was not removed...
if (sessions.containsKey(player.getId())) { // TODO threadsafe
// ...because in the meantime some other thread logged in as that user
throw new ServiceError(LobbyService.ERR_LOGIN_INVALID, Maps.create("reason", "already-logged-in"));
} else {
// ...because it was no longer there, which is as it should be
}
} else {
// it was removed, which is bad, because it shouldn't have been there still
log.warn("Kicking old session of " + player.getId() + " failed");
}

或概括:

if (!sessions.remove(key, expected)) {
if (sessions.containsKey(key)) { // TODO threadsafe
// 2
} else {
// 3
}
} else {
// 1
}

最佳答案

我不明白您在文档中看到的内容与您想要的内容之间的区别。所以请让我把事情写下来。

  • A 与值 B 关联。 remove(A, B) 将返回 true 删除映射 A->B(这是您想要的)。
  • A 与值 C 关联。 remove(A, B) 将返回 false,映射 A->C 不会被删除(这是您想要的)。
  • key A 没有关联任何值。 remove(A, null) 将返回 false(这是您想要的)。

换句话说,似乎 remove 恰好做了您想要的……或者您的代码中可能存在另一个错误。

关于java - 从 ConcurrentMap.remove() 获取键是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8725272/

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