我正在编写一个类,其中多个线程使用静态ConcurrentHashMap
(包括get()
,put()
,clear()
等操作)。在这个类中,我还需要将ConcurrentHashMap
序列化到一个文件中,并从文件中反序列化它。问题是ConcurrentHashMap
可以在序列化时进行修改,因此可能不是线程安全的。
我的问题是:
ConcurrentHashMap
是线程安全的,在被多个线程序列化时被修改是否安全? (我猜答案是否定的,但需要确认)ConcurrentHashMap
的最佳做法是什么,同时存在修改的风险。请注意,安全性和性能对我的应用程序都至关重要。答案 0 :(得分:0)
首先查看Javadoc:
一个哈希表,支持检索的完全并发和更新的高预期并发性。
从这个意义上讲,答案是:取决于。
如上所示:在进行更新时,可以读取这样的地图。
理论上,您可以通过简单地阅读所有条目来“序列化”您的地图;并存储这些。但是,当然,您不知道在阅读地图时是否进行了更新。因此 - 不是一个好主意。
然后让我们考虑在一个镜头中序列化整个地图。它可能又取决于你是如何做到这一点的(比如:使用普通的旧java对象序列化 - 或者像jackson或gson这样的库,以便将地图序列化为JSON) - 但另一方面,序列化将不得不看地图对象的内部。而不希望地图在此过程中得到更新。
结论:唯一的选择是使用 lock ,任何要更新或序列化地图的线程都必须保留。
有关各种类型锁的介绍,请参阅here。
而且你知道,你不可能双管齐下。如果您的数据的完整性对您很重要,那么您必须在序列化地图时阻止所有添加/更新/删除请求!