在多线程环境中序列化 concurrenthashmap 的正确方法
Proper way to serialize concurrenthashmap in multithread environment
我正在写一个 class,其中使用了静态 ConcurrentHashMap
(使用 get()
、put()
、clear()
等操作)通过多个线程。在这个 class 中我还需要将 ConcurrentHashMap
序列化到一个文件中,并从文件中反序列化它。问题是 ConcurrentHashMap
可以在序列化时修改,因此它可能不是线程安全的。
我的问题是:
ConcurrentHashMap
是线程安全的,多线程序列化的时候被修改安全吗? (我猜答案是否定的,但需要确认)
- 在多线程中序列化
ConcurrentHashMap
的最佳做法是什么,同时存在修改的风险。请注意,安全性和性能对我的应用程序都至关重要。
您首先查看 Javadoc:
A hash table supporting full concurrency of retrievals and high expected concurrency for updates.
从这个意义上说,答案是:它取决于。
如上所示:这样的地图可以在更新的时候读取。
所以理论上,您可以 "serialize" 通过简单地阅读 所有 它的条目来制作您的地图;并存储那些。但是,当然,您不知道在阅读地图时是否发生了更新。因此 - 这不是一个好主意。
那么让我们考虑在一个镜头中连载整个地图。这可能又取决于你是如何做到这一点的(比如:使用普通的旧 java 对象序列化——或者可能是 jackson 或 gson 等库,以便将地图序列化为 JSON)——但另一方面,序列化将不得不查看地图对象的内部结构。而且您不希望地图在进行时得到更新。
结论:你唯一的选择是使用锁,任何要更新或序列化地图的线程都有持有。
有关各种类型锁的介绍,请参阅here。
你知道,你不能两者兼得。如果数据的完整性对您很重要,那么您必须在地图序列化时 阻止 所有 adds/updates/removals 请求!
我正在写一个 class,其中使用了静态 ConcurrentHashMap
(使用 get()
、put()
、clear()
等操作)通过多个线程。在这个 class 中我还需要将 ConcurrentHashMap
序列化到一个文件中,并从文件中反序列化它。问题是 ConcurrentHashMap
可以在序列化时修改,因此它可能不是线程安全的。
我的问题是:
ConcurrentHashMap
是线程安全的,多线程序列化的时候被修改安全吗? (我猜答案是否定的,但需要确认)- 在多线程中序列化
ConcurrentHashMap
的最佳做法是什么,同时存在修改的风险。请注意,安全性和性能对我的应用程序都至关重要。
您首先查看 Javadoc:
A hash table supporting full concurrency of retrievals and high expected concurrency for updates.
从这个意义上说,答案是:它取决于。
如上所示:这样的地图可以在更新的时候读取。
所以理论上,您可以 "serialize" 通过简单地阅读 所有 它的条目来制作您的地图;并存储那些。但是,当然,您不知道在阅读地图时是否发生了更新。因此 - 这不是一个好主意。
那么让我们考虑在一个镜头中连载整个地图。这可能又取决于你是如何做到这一点的(比如:使用普通的旧 java 对象序列化——或者可能是 jackson 或 gson 等库,以便将地图序列化为 JSON)——但另一方面,序列化将不得不查看地图对象的内部结构。而且您不希望地图在进行时得到更新。
结论:你唯一的选择是使用锁,任何要更新或序列化地图的线程都有持有。
有关各种类型锁的介绍,请参阅here。
你知道,你不能两者兼得。如果数据的完整性对您很重要,那么您必须在地图序列化时 阻止 所有 adds/updates/removals 请求!