在 Java 中ConcurrentMap
,有remove(key, expectedValue)
,这将返回以下之一:
- 期望值在那里并且已被删除。
- 预期值不存在,因此尚未删除。
但我想要得到的是其中之一:
- 期望值在那里并且已被删除。
- 该键下有一个值,但不是预期的值,因此尚未删除。
- 该键下没有任何值,因此尚未删除。
如何以并发和线程安全的方式获取这些信息?
这是我要验证的代码
// 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
}