Java同步块与concurrentHashMap与Collections.synchronizedMap

2024-02-11

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

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

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

现在,如果我将 hashmap 更改为 ConcurrentHashMap,而不是使用同步方法,如下所示,会有什么行为?

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

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


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

与所有改进一样,仍然存在一些权衡。方法的语义 对整个Map进行操作的,例如size和isEmpty,都被稍微修改了 削弱以反映集合的并发性质。由于尺寸的结果 计算时可能已经过时,这实际上只是一个估计,所以大小 允许返回近似值而不是精确计数。虽然一开始这个 可能看起来令人不安,实际上像 size 和 isEmpty 这样的方法在以下方面的用处要小得多: 并发环境,因为这些数量是移动目标。



第二,Collections.synchronizedMap

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java同步块与concurrentHashMap与Collections.synchronizedMap 的相关文章

随机推荐