【发布时间】:2014-08-11 19:22:33
【问题描述】:
我有一个 Java 应用程序,我在其中将其他服务器的 IP 集保存在内存中的哈希映射中。哈希映射包含服务器实例 ID 到服务器 IP 地址之间的映射。我还在数据库中维护这些服务器信息以保持持久性。
我正在尝试解决一个简单的问题,我只需要将服务器信息缓存在内存中以便更快地访问。所以我为此使用了hashmap。而且我需要确保内存中的服务器信息不是陈旧的,并且缓存中的所有服务器都是响应的。
所以我创建了两个单独的后台守护线程
- 一个线程从哈希图中获取每个条目并 ping 所有条目。如果任何服务器没有响应,则它会从哈希图中删除该条目。
- 另一个线程基本上将数据库条目与此哈希映射缓存同步。因此,它会查询所有条目数据库,并删除哈希图中不存在于 DB 中的条目,对于 DB 中的新条目,它会 ping 每个条目并添加到哈希图中。
这里第一个线程频繁运行,假设每 15 秒运行一次,第二个数据库线程每 5 分钟运行一次。
由于这里的两个线程都在更新缓存,所以我使用了 ConcurrentHashMap,因为它会被同步。即便如此,当我阅读多篇文章、文档和一些 stackoverflow 帖子时,我看到多个线程更新 hashmap 是有风险的,比如当一个线程迭代 hashmap 时,另一个线程可能会被触发并开始更新 hashmap。
那么我该如何在这里使用不同的方法来解决这个问题,这样我就不会在应用程序性能、时间和空间复杂性方面干扰 JVM,并确保我的哈希图中始终只有响应式服务器条目.
【问题讨论】:
-
你能澄清你的担忧吗?多个线程迭代哈希图不一定是问题。你在担心什么?
-
另外,有理由使用 2 个线程吗?为什么不让一个线程操作缓存呢?
-
我没有看到 2 个线程在 hashmap 上迭代的问题,但我担心的是 1 个线程正在添加条目,而另一个线程正在添加/删除条目。尽管这些操作非常少见,但由于我们要更新来自 2 个不同实体的哈希图,应用程序的性能会受到影响吗?
-
不,不会有性能问题。
标签: java hashmap synchronization concurrenthashmap