gpt4 book ai didi

java - 非select操作情况下HashMap和ConcurrentHashMap的主要区别?

转载 作者:行者123 更新时间:2023-11-30 08:20:50 24 4
gpt4 key购买 nike

据我所知,在 HashMapConcurrentHashMap 中执行非选择操作时,ConcurrentHashMap 会阻塞整个 Segments(默认为 16)?

最佳答案

区别在于 HashMap 不是线程安全的,这意味着如果您有多个线程使用它,您需要自己处理并发操作。您可以使用 Collections.synchronizedMap(map) 轻松使其成为线程安全的,它创建一个包装对象,其中所有方法都是同步(在该包装对象)并委托(delegate)给包装的 map 。正如您所理解的那样,这意味着性能不佳,因为只有一个线程(读取器或写入器无关紧要)可以访问它。

正如您所指出的,ConcurrentHashMap 是线程安全的,并且尝试以与 Collections.synchronizedMap() 略有不同的方式处理同步。它尝试通过将底层映射划分为 bucket 并为每个 bucket 一个锁来尝试使用多个锁,而不是单个锁。这样多个线程就可以同时使用 map 而不会出现问题,因为它们可能正在处理不同存储桶中的记录。在这种情况下,您不需要锁定整个映射(所有存储桶),只需锁定您感兴趣的记录所在的存储桶,这意味着您可以同时对所有存储桶执行并行操作。显然,如果所有线程都在同一条记录(或同一个桶)上工作,它们仍然会像 Collections.synchronizedMap() 中那样同步,并且在写入时会被阻塞。当您的读者线程数超过编写者线程数时,这种方法非常好。

例如你可能有(非常简单):

ConcurrentHashMap = [ bucket1 = [r1->x], bucket2 = [r2->y], bucket3 = [r3, z] ]

当您对带有键 r1 的条目执行读/写操作时, map 将选择 bucket1 因为该记录应该存在并锁定 bucket1 且仅锁定 bucket1。然后,当另一个线程到来时,如果它查询 r2,它可以安全地这样做,但如果它查询 r1,它也必须等待,因为 bucket1 被锁定。

当然,所有这些背后都有性能损失,但并不是特别高(尽管我没有任何基准来支持此声明)。

这是否回答了您的问题?

关于java - 非select操作情况下HashMap和ConcurrentHashMap的主要区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25661729/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com