java - Java HashMap对象的并发访问

标签 java dictionary concurrency concurrenthashmap

我正在构建一个 Java REST 应用程序,其中使用 HashMap 来存储一些数据。

由于它有一个服务器,它可以同时处理多个访问 HashMap 的请求。发出的所有请求都会检查 Map 是否具有预定义值(该值取决于请求正文),如果没有,则将该值添加到 Map 并返回它。如果 Map 已经具有该值,它只会返回 Map 上的值。

为了拥有一个运行可靠的系统,我应该考虑什么?我将对 map 进行多次读取和一些写入(主要是在应用程序启动时,因为 map 将为空)。

tl;博士

  • Java 服务器将处理多个并发请求。
  • 每个请求都会至少发出一个 Map.containsKey(someKey) 并最终发出一个 Map.get(someKey)
  • 某些请求将生成 Map.put(someKey, someValue)

我应该使用某种并发数据结构吗?

为了争论,我知道使用内存解决方案并不可靠。这不适用于生产用途,仅用于学术目的。

最佳答案

我们首先假设我们正在使用 ConcurrentHashMapHashMap 的一个版本,在并行访问时具有更可预测和直观的内存一致性效果。

鉴于此,最大的考虑是尽可能使单个键上的所有操作原子化,或者至少不会被想要对该键执行其他操作的另一个线程中断。如果您使用的是 Java 8 或更高版本,请使用 ConcurrentHashMapcomputeIfAbsent 实现方法将在计算和存储新值时将其他线程排除在外。

...作为应用程序开发人员,这正是您想要的:使用一个由专家编写、审查、测试和使用的库,了解您正在编写的语言和环境的并发影响。应用程序。

关于java - Java HashMap对象的并发访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54275168/

相关文章:

java - 是否有 != 值的compareAndSet (compareAndSetIfUnequal)?

java - 如何从 2 个独立的 JavaFX 服务线程中获取结果?

java - java中的多个json绑定(bind)

arrays - Python如何将带有西里尔符号的字典保存到json文件中

python multiprocessing map 对最后一个进程的错误处理

java - JUnit并发访问synchronizedSet

java - 如何在Spring Controller 类中使用路径变量?

java - 在 Android 中,是否有理由为不打算翻译的字符串使用字符串资源?

java - 无法从资源加载图片

python - 为字典中的句子赋予值