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

时间:2017-09-26 09:45:11

标签: java multithreading concurrenthashmap

我有一种情况,每当我的ConcurrentHashMap更新时,我需要清除现有文件并再次将整个数据写入文件。所以每次我更新清除文件并将数据再次写入文件会导致高延迟。所以我在想,每当我的hashmap处于空闲状态时,如果没有进行更新操作,那么我会将整个数据写入文件,否则我将等到hashmap空闲。

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

2 个答案:

答案 0 :(得分:2)

听起来你需要通过将ConcurrentHashMap包装在一个类中来使用封装,并且可能使用Queue添加/删除方法。查看java.util.concurrent包以获取其他选项。

想法是使用Queue。每次访问Map都会通过调用包装器中的添加/删除并将其添加到队列中。然后会有一个消耗队列的无限Thread循环。在执行此操作时,您可以检查队列是否为空并且文件是否保持不变。

答案 1 :(得分:2)

  

那么有没有办法知道ConcurrentHashMap上没有删除操作?

简短的回答:没有办法。

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

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

  • 发生更新请求时:
    1. 对并发hashmap执行更新
    2. 将请求添加到队列
  • 在后台线程中:
    1. 从队列中提取请求,并对第二个(影子)hashmap执行更新
    2. 定期或基于其他一些标准,停止拉取请求并将阴影散列图刷新到文件中。

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

队列在写入阴影散列图时提供请求缓冲。

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

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

解决这个问题的另一种方法是更快地写入文件。我怀疑它很慢的原因是因为您当前的设计要求您每次都清除并重写文件。另一种方法是仅将更改写入文件。这意味着你可能还有更多的工作要做重启...假设文件的目的是记录地图状态,以便你可以重新启动。