假设如果有一个同步方法,并且在该方法中,我会像这样更新哈希图:
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(使用前将#替换为@)