java - ConcurrentHashMap 与基于 ReentrantReadWriteLock 的用于重新加载的自定义映射

标签 java locking concurrenthashmap reentrantreadwritelock

Java 大师,

目前我们有一个 HashMap<String,SomeApplicationObject> 经常读取并偶尔修改,我们遇到了在修改/重新加载期间,读取操作返回 null 的问题这是 Not Acceptable 。

要解决这个问题,我有以下选项:

A.使用 ConcurrentHashMap

这看起来像是首选,但我们正在谈论的操作是reload() - 表示 clear()其次是 replaceAll() .所以如果Map正在阅读帖子 clear()和前 replaceAll()它返回 null 这是不可取的。即使我synchronize这并不能解决问题。

B.基于 ReentrantReadWriteLock 创建另一个实现

我将在哪里创建 acquire Write Lock之前 reload()手术。这似乎更合适,但我觉得必须有一些已经可用的东西,我不需要重新发明轮子。

最好的出路是什么?

EDIT 是否有任何 Collection 已经可以使用此功能?

最佳答案

由于您正在重新加载 map ,我会在重新加载时替换它。

您可以使用 volatile 映射来实现这一点,当它更新时,您可以将其完全替换。

关于java - ConcurrentHashMap 与基于 ReentrantReadWriteLock 的用于重新加载的自定义映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12109185/

相关文章:

java - 将 ConcurrentHashMap 传递给另一个类的最佳方法?

java - ConcurrentHashMap迭代保证

java - 如何从 java 中的许多图 block 创建大图像文件?

java - 如何在运行时修改 Web 应用程序中的属性文件?

java - LOCK TABLE 和 try-catch block

objective-c - NSLocking 的使用是否应该始终包含在@try/@finally 中?

multithreading - 附近一字节变量的原子写入

java - OSGi 和性能?

java - CXF、WS-Security 和 Spring : UserToken

java - 为什么我们需要 Scala 的 ParHashMap 而 Java 有 ConcurrentHashMap