代码之家  ›  专栏  ›  技术社区  ›  hema chandra

如何知道在JAVA中没有任何操作在ConcurrentHashMap上运行或处于空闲状态?

  •  2
  • hema chandra  · 技术社区  · 7 年前

    基本上,我将从映射中连续删除字符串。所以每次我从HashMap中删除一个字符串写入文件都是一个非常昂贵的操作。那么有没有办法知道ConcurrentHashMap上没有删除操作?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Stephen C    7 年前

    但即使没有,你仍然会遇到问题。例如,假设新的更新在您开始清除/写入后立即到达。


    我认为解决方案是使用两个映射和一个队列。

    • 当发生更新请求时:
      1. 在并发哈希映射上执行更新
    • 在后台线程中:
      1. 从队列中提取请求,并在第二个(阴影)哈希映射上执行更新
      2. 定期或基于其他一些标准,停止提取请求并将阴影哈希映射刷新到文件。

    主hashmap总是快速更新,并且总是最新的。更新和使用主哈希映射的操作不会(显著)被阻止。

    第二个hashmap只由一个线程访问,因此它不需要并发。因此速度会更快。

    文件的状态通常会稍微落后于主hashmap。但这是不可避免的。避免这种情况的唯一方法是阻止对主地图的更新。。。这就是你想要避免的。


    另一种方法是加快文件写入速度。我怀疑它之所以慢是因为您当前的设计要求您每次都清除并重写文件。另一种方法是只编写 变化 到文件。这意味着你可能有更多的工作要做的重新启动。。。假设文件的目的是记录映射状态,以便可以重新启动。

        2
  •  2
  •   Murat Karagöz    7 年前

    听起来您需要通过在类中包装ConcurrentHashMap来利用封装,并且可能需要使用带有队列的add/remove方法。看看 java.util.concurrent

    这个想法是使用 Queue . 每次访问 Map 将从包装器中调用添加/删除,并将其添加到队列中。然后将有一个无限线程循环占用队列。在执行此操作时,您可以检查队列是否为空,并执行文件持久化。