在多线程环境中序列化 concurrenthashmap 的正确方法

Proper way to serialize concurrenthashmap in multithread environment

我正在写一个 class,其中使用了静态 ConcurrentHashMap(使用 get()put()clear() 等操作)通过多个线程。在这个 class 中我还需要将 ConcurrentHashMap 序列化到一个文件中,并从文件中反序列化它。问题是 ConcurrentHashMap 可以在序列化时修改,因此它可能不是线程安全的。

我的问题是:

  1. ConcurrentHashMap是线程安全的,多线程序列化的时候被修改安全吗? (我猜答案是否定的,但需要确认)
  2. 在多线程中序列化 ConcurrentHashMap 的最佳做法是什么,同时存在修改的风险。请注意,安全性和性能对我的应用程序都至关重要。

您首先查看 Javadoc:

A hash table supporting full concurrency of retrievals and high expected concurrency for updates.

从这个意义上说,答案是:它取决于

如上所示:这样的地图可以在更新的时候读取。

所以理论上,您可以 "serialize" 通过简单地阅读 所有 它的条目来制作您的地图;并存储那些。但是,当然,您不知道在阅读地图时是否发生了更新。因此 - 这不是一个好主意。

那么让我们考虑在一个镜头中连载整个地图。这可能又取决于你是如何做到这一点的(比如:使用普通的旧 java 对象序列化——或者可能是 jackson 或 gson 等库,以便将地图序列化为 JSON)——但另一方面,序列化将不得不查看地图对象的内部结构。而且您希望地图在进行时得到更新。

结论:你唯一的选择是使用,任何要更新序列化地图的线程都有持有。

有关各种类型锁的介绍,请参阅here

你知道,你不能两者兼得。如果数据的完整性对您很重要,那么您必须在地图序列化时 阻止 所有 adds/updates/removals 请求!