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

Java 在多线程环境中序列化concurrenthashmap的正确方法,java,multithreading,serialization,concurrenthashmap,Java,Multithreading,Serialization,Concurrenthashmap,我正在编写一个类,在这个类中,多个线程使用static(与get(),put(),clear()等操作)。在这个类中,我还需要将ConcurrentHashMap序列化到一个文件中,并从该文件中反序列化它。问题是,ConcurrentHashMap可以在序列化时修改,因此它可能不是线程安全的 我的问题是: ConcurrentHashMap是线程安全的,当它被多个线程序列化时被修改是否安全?(我猜答案是否定的,但需要确认) 在多线程中序列化ConcurrentHashMap的最佳实践是什么,同时

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

我的问题是:

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

  • 首先,请查看以下内容:

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

    从这个意义上说,答案是:视情况而定

    如上所示:可以在更新地图时读取该地图

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

    然后让我们考虑一下一次性序列化整个地图。这可能再次取决于您是如何做到这一点的(比如:使用普通的旧java对象序列化,或者使用jackson或gson等库将映射序列化为JSON),但另一方面,序列化必须查看映射对象的内部。您确实不希望在进行此操作时更新地图

    结论:您唯一的选择是使用锁,任何要更新或序列化映射的线程都必须持有该锁

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


    你知道,你不能两全其美。如果数据的完整性对您很重要,那么您必须在地图序列化时阻止所有添加/更新/删除请求

    您可以从查看以下内容开始:

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

    从这个意义上说,答案是:视情况而定

    如上所示:可以在更新地图时读取该地图

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

    然后让我们考虑一下一次性序列化整个地图。这可能再次取决于您是如何做到这一点的(比如:使用普通的旧java对象序列化,或者使用jackson或gson等库将映射序列化为JSON),但另一方面,序列化必须查看映射对象的内部。您确实不希望在进行此操作时更新地图

    结论:您唯一的选择是使用锁,任何要更新或序列化映射的线程都必须持有该锁

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


    你知道,你不能两全其美。如果数据的完整性对您很重要,那么您必须在地图序列化时阻止所有添加/更新/删除请求

    好的,阻塞或排队。这是一个次要的问题,因为这类地图的大多数用户都需要同步访问,但值得一提的是:)好的,阻塞或排队。这是一个次要问题,因为此类地图的大多数用户都需要同步访问,但值得指出:)