并发访问Java HashMap对象

时间:2019-01-20 09:37:56

标签: java dictionary concurrency concurrenthashmap

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

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

要拥有一个运行可靠的系统,我应该考虑什么?我将在Map上进行许多读取,并进行一些写操作(主要是在应用程序启动时,因为Map将为空)。

tl; dr

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

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

出于争论的目的,我知道使用内存中的解决方案并不可靠。这不是供生产使用的,只是出于学术目的。

2 个答案:

答案 0 :(得分:0)

让我们首先假设我们使用的是ConcurrentHashMap,这是HashMap的一个版本,当并行访问时,它具有更可预测和直观的内存一致性效果。

鉴于此,最大的考虑是尽可能对单个键原子进行所有操作,或者至少不被希望对该键执行其他操作的另一个线程中断。如果您使用的是Java 8或更高版本,则在计算和存储新值时,使用ConcurrentHashMap的{​​{3}}方法的实现将使其他线程保持空白。

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

答案 1 :(得分:-1)

如果要将其保留在内存中,则需要使用ConcurrentHashMap。

但是,如果重新启动应用程序并丢失了内存数据会怎样?