gpt4 book ai didi

Java 同步块(synchronized block)与 concurrentHashMap 与 Collections.synchronizedMap

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:30:01 24 4
gpt4 key购买 nike

假设如果有一个同步方法并且在该方法中,我会像这样更新一个 hashmap:

public synchronized void method1()
{
myHashMap.clear();
//populate the hashmap, takes about 5 seconds.
}

现在当 method1 正在运行并且 hashmap 正在重新填充时,如果有其他线程试图获取 hashmap 的值,我假设它们会被阻止?

现在不使用 sync 方法,如果我像下面这样将 hashmap 更改为 ConcurrentHashMap,会有什么行为?

public void method1()
{
myConcurrentHashMap.clear();
//populate the hashmap, takes about 5 seconds.
}

如果我使用 Collections.synchronizedMap 会怎么样?一样吗?

最佳答案

CHM(ConcurrentHashMap),而不是在公共(public)锁上同步每个方法,限制对单个线程的访问一次,它使用一种称为锁 strip 化的更细粒度的锁定机制来允许更大程度的共享访问。任意多个阅读线程可以同时访问 map ,读者可以同时访问 map 作者,并且有限数量的作者可以同时修改 map 。结果在并发访问下具有更高的吞吐量,几乎没有性能损失单线程访问。ConcurrentHashMap 以及其他并发集合进一步改进了通过提供不抛出的迭代器来同步集合类ConcurrentModificationException,从而消除了锁定集合的需要在迭代期间。

与所有改进一样,仍然存在一些折衷。方法的语义对整个Map进行操作的,比如size和isEmpty,已经略微弱化以反射(reflect)集合的并发性质。由于大小的结果在计算时可能已经过时,它实际上只是一个估计,所以大小允许返回近似值而不是精确计数。虽然起初这可能看起来令人不安,实际上像 size 和 isEmpty 这样的方法在并发环境,因为这些数量是移动目标。



其次,Collections.synchronizedMap

它只是带有同步方法的简单 HashMap - 我将其称为已弃用的 CHM

关于Java 同步块(synchronized block)与 concurrentHashMap 与 Collections.synchronizedMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12628600/

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