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

时间:2017-07-18 07:29:17

标签: java multithreading serialization concurrenthashmap

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

我的问题是:

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

1 个答案:

答案 0 :(得分:0)

首先查看Javadoc

  

一个哈希表,支持检索的完全并发和更新的高预期并发性。

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

如上所示:在进行更新时,可以读取这样的地图

理论上,您可以通过简单地阅读所有条目来“序列化”您的地图;并存储这些。但是,当然,您不知道在阅读地图时是否进行了更新。因此 - 不是一个好主意。

然后让我们考虑在一个镜头中序列化整个地图。它可能又取决于你是如何做到这一点的(比如:使用普通的旧java对象序列化 - 或者像jackson或gson这样的库,以便将地图序列化为JSON) - 但另一方面,序列化将不得不看地图对象的内部。而希望地图在此过程中得到更新。

结论:唯一的选择是使用 lock ,任何要更新序列化地图的线程都必须保留。

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

而且你知道,你不可能双管齐下。如果您的数据的完整性对您很重要,那么您必须在序列化地图时阻止所有添加/更新/删除请求!