Java 在多线程环境中序列化concurrenthashmap的正确方法
我正在编写一个类,在这个类中,多个线程使用static(与Java 在多线程环境中序列化concurrenthashmap的正确方法,java,multithreading,serialization,concurrenthashmap,Java,Multithreading,Serialization,Concurrenthashmap,我正在编写一个类,在这个类中,多个线程使用static(与get(),put(),clear()等操作)。在这个类中,我还需要将ConcurrentHashMap序列化到一个文件中,并从该文件中反序列化它。问题是,ConcurrentHashMap可以在序列化时修改,因此它可能不是线程安全的 我的问题是: ConcurrentHashMap是线程安全的,当它被多个线程序列化时被修改是否安全?(我猜答案是否定的,但需要确认) 在多线程中序列化ConcurrentHashMap的最佳实践是什么,同时
get()
,put()
,clear()
等操作)。在这个类中,我还需要将ConcurrentHashMap
序列化到一个文件中,并从该文件中反序列化它。问题是,ConcurrentHashMap
可以在序列化时修改,因此它可能不是线程安全的
我的问题是:
ConcurrentHashMap
是线程安全的,当它被多个线程序列化时被修改是否安全?(我猜答案是否定的,但需要确认)ConcurrentHashMap
的最佳实践是什么,同时存在修改的风险。请注意,安全性和性能对我的应用程序都至关重要首先,请查看以下内容: 一个哈希表,支持检索的完全并发性和更新的高预期并发性 从这个意义上说,答案是:视情况而定 如上所示:可以在更新地图时读取该地图 因此,从理论上讲,您可以通过简单地读取all其条目来“序列化”地图;并将其储存起来。但当然,你不知道在阅读地图时是否发生了更新。因此,这不是一个好主意 然后让我们考虑一下一次性序列化整个地图。这可能再次取决于您是如何做到这一点的(比如:使用普通的旧java对象序列化,或者使用jackson或gson等库将映射序列化为JSON),但另一方面,序列化必须查看映射对象的内部。您确实不希望在进行此操作时更新地图 结论:您唯一的选择是使用锁,任何要更新或序列化映射的线程都必须持有该锁 有关各种类型锁的介绍,请参见
你知道,你不能两全其美。如果数据的完整性对您很重要,那么您必须在地图序列化时阻止所有添加/更新/删除请求 您可以从查看以下内容开始: 一个哈希表,支持检索的完全并发性和更新的高预期并发性 从这个意义上说,答案是:视情况而定 如上所示:可以在更新地图时读取该地图 因此,从理论上讲,您可以通过简单地读取all其条目来“序列化”地图;并将其储存起来。但当然,你不知道在阅读地图时是否发生了更新。因此,这不是一个好主意 然后让我们考虑一下一次性序列化整个地图。这可能再次取决于您是如何做到这一点的(比如:使用普通的旧java对象序列化,或者使用jackson或gson等库将映射序列化为JSON),但另一方面,序列化必须查看映射对象的内部。您确实不希望在进行此操作时更新地图 结论:您唯一的选择是使用锁,任何要更新或序列化映射的线程都必须持有该锁 有关各种类型锁的介绍,请参见
你知道,你不能两全其美。如果数据的完整性对您很重要,那么您必须在地图序列化时阻止所有添加/更新/删除请求 好的,阻塞或排队。这是一个次要的问题,因为这类地图的大多数用户都需要同步访问,但值得一提的是:)好的,阻塞或排队。这是一个次要问题,因为此类地图的大多数用户都需要同步访问,但值得指出:)