gpt4 book ai didi

java - 如何安全地清理并发映射

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

我正在尝试解决一个对我来说很常见的问题,但我找不到好的解决方案。

在非常并发的环境中,我需要在客户端 session 被破坏时正确释放资源。这里是输入:

  • 我使用ConcurrentHashMap来存储所有分配的资源,这里需要map来索引资源
  • 当 session 被销毁时,有时会从挂起的任务中分配新资源,我也希望最终取消分配这些资源

这是我当前的解决方案:

while (!resourceMap.isEmpty()) {
Map<Integer, Resource> toDestroy = new HashMap<>(resourceMap);
for (Resource resource : toDestroy.values()) {
resource.destroy();
}
resourceMap.keySet().removeAll(toDestroy.keySet());
}

其存在只是因为 ConcurrentHashMap#values#iterator 并不总是反射(reflect)对 resourceMap 的并发放入。我不喜欢这段代码,更喜欢类似队列的代码,但不幸的是 ConcurrentMap 没有提供这样的东西:

while ((Map.Entry<String, Resource> entry = resourceMap.removeAny()) != null) {
entry.value().destroy();
}

我正在寻找类似于上面类似队列的代码的解决方案或解决此问题的任何替代方法。

最佳答案

I do not like this code and would prefer queue-like code, but unfortunately ConcurrentMap does not provide anything like this ...

我只会使用迭代器,但话又说回来,我不是 Java 8 的粉丝。

while (!resourceMap.isEmpty()) {
Iterator<Resource> iterator = resourceMap.values().iterator();
while (iterator.hasNext()) {
Resource resource = iterator.next();
iterator.remove();
resource.destroy();
}
}

值得注意的是,该模型中存在竞争条件。有人可以获得资源,去使用它,但同时它正在被这个线程销毁。

关于java - 如何安全地清理并发映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50415233/

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