如何知道ConcurrentHashMap上没有操作运行或者JAVA中处于Idle状态?
How to know that no operation is running on ConcurrentHashMap or in Idle state in JAVA?
我有这样一种情况,每当我的 ConcurrentHashMap 更新时,我需要清除现有文件并将整个数据再次写入文件。因此,每次我更新清除文件并将数据再次写入文件时都会导致高延迟。所以我在想,每当我的 hashmap 处于空闲状态时,如果没有更新操作正在进行,那么我会将整个数据写入文件,否则我会等到 hashmap 空闲。
基本上,我会不断地从 Map 中删除字符串。所以每次我从写入文件的 HashMap 中删除一个 String 都是一个非常昂贵的操作。那么有没有办法知道ConcurrentHashMap没有删除操作呢?
听起来您需要通过将 ConcurrentHashMap 包装在 class 中来利用封装,并且可能需要 add/remove 方法和 Queue。查看 java.util.concurrent 包以了解其他选项。
我的想法是使用 Queue
。对 Map
的每次访问都将通过从包装器调用 add/remove 并将其添加到队列中来进行。然后就会有一个无限的线程循环消耗队列。执行此操作时,您可以检查队列是否为空并保留文件。
So is there a way to know that no deletion operation is going on the ConcurrentHashMap?
简答:不,没有办法。
但即使没有,您仍然会遇到问题。例如,假设在您开始清除/写入后新的更新立即到达。
我认为解决方案是使用两个映射和一个队列。
- 更新请求发生时:
- 对并发哈希图执行更新
- 将请求添加到队列
- 在后台线程中:
- 从队列中拉取请求,并在第二个(影子)hashmap 上执行更新
- 定期或根据其他一些标准,停止拉取请求并将影子哈希图刷新到文件中。
主哈希图总是快速更新,并且始终是最新的。更新和使用主哈希图的操作不会(显着)阻塞。
写入影子散列映射时,队列提供请求缓冲。
第二个hashmap只被一个线程访问,所以不需要并发。因此它会更快。
文件的状态通常会稍微落后于主哈希图。但这是不可避免的。避免这种情况的唯一方法是阻止对主地图的更新……这是您要避免的。
解决此问题的另一种方法是加快写入文件的速度。我怀疑它之所以慢是因为您当前的设计要求您每次都清除并重写文件。另一种方法是只将 更改 写入文件。这意味着您在重启时可能有更多工作要做...假设该文件的目的是记录地图状态,以便您可以重启。
我有这样一种情况,每当我的 ConcurrentHashMap 更新时,我需要清除现有文件并将整个数据再次写入文件。因此,每次我更新清除文件并将数据再次写入文件时都会导致高延迟。所以我在想,每当我的 hashmap 处于空闲状态时,如果没有更新操作正在进行,那么我会将整个数据写入文件,否则我会等到 hashmap 空闲。
基本上,我会不断地从 Map 中删除字符串。所以每次我从写入文件的 HashMap 中删除一个 String 都是一个非常昂贵的操作。那么有没有办法知道ConcurrentHashMap没有删除操作呢?
听起来您需要通过将 ConcurrentHashMap 包装在 class 中来利用封装,并且可能需要 add/remove 方法和 Queue。查看 java.util.concurrent 包以了解其他选项。
我的想法是使用 Queue
。对 Map
的每次访问都将通过从包装器调用 add/remove 并将其添加到队列中来进行。然后就会有一个无限的线程循环消耗队列。执行此操作时,您可以检查队列是否为空并保留文件。
So is there a way to know that no deletion operation is going on the ConcurrentHashMap?
简答:不,没有办法。
但即使没有,您仍然会遇到问题。例如,假设在您开始清除/写入后新的更新立即到达。
我认为解决方案是使用两个映射和一个队列。
- 更新请求发生时:
- 对并发哈希图执行更新
- 将请求添加到队列
- 在后台线程中:
- 从队列中拉取请求,并在第二个(影子)hashmap 上执行更新
- 定期或根据其他一些标准,停止拉取请求并将影子哈希图刷新到文件中。
主哈希图总是快速更新,并且始终是最新的。更新和使用主哈希图的操作不会(显着)阻塞。
写入影子散列映射时,队列提供请求缓冲。
第二个hashmap只被一个线程访问,所以不需要并发。因此它会更快。
文件的状态通常会稍微落后于主哈希图。但这是不可避免的。避免这种情况的唯一方法是阻止对主地图的更新……这是您要避免的。
解决此问题的另一种方法是加快写入文件的速度。我怀疑它之所以慢是因为您当前的设计要求您每次都清除并重写文件。另一种方法是只将 更改 写入文件。这意味着您在重启时可能有更多工作要做...假设该文件的目的是记录地图状态,以便您可以重启。