2017-07-18 102 views
1

我写在其中使用静态ConcurrentHashMap一类(操作,比如get()put()clear()等)由多个线程。在这个类中,我还需要将ConcurrentHashMap序列化为一个文件,并从文件反序列化它。问题在于ConcurrentHashMap在被序列化时可以被修改,因此它可能不是线程安全的。有道序列化的ConcurrentHashMap在多线程环境

我的问题是:

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

回答

0

你开始通过查看Javadoc

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

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

如上所示:可以读取这样的地图,而它正在被更新。

因此,从理论上讲,您可以通过简单阅读全部条目“序列化”您的地图;并存储这些。但是当然,你不知道更新是否在阅读地图时发生。因此 - 不是一个好主意。

然后让我们考虑一下序列化整个地图一个一枪。它可能会再次取决于你是如何做到这一点的(例如:使用普通的旧java对象序列化 - 或者为了将地图序列化成JSON,可能使用诸如jackson或gson之类的库) - 但是另一方面,序列化将不得不看看地图对象的内部。而你做不是希望地图得到更新,而这是在进行中。

结论:你唯一的选择是使用这是要更新任何线程序列化映射具有持有。

请参阅here了解各种类型的锁的介绍。

而且你知道,你不能两面都有。如果您的数据完整性对您来说很重要,那么您必须所有增加/更新/删除请求,而地图序列化!

+0

欢迎,阻止或排队。这是一个小问题,因为这些地图的大多数用户需要同步访问,但值得说明的是:) –