neo*_*neo 8 java synchronization
说如果有一个synchronized方法并且在该方法中,我更新一个这样的hashmap:
public synchronized void method1()
{
myHashMap.clear();
//populate the hashmap, takes about 5 seconds.
}
Run Code Online (Sandbox Code Playgroud)
现在当method1正在运行并且正在重新填充hashmap时,如果还有其他线程要获取hashmap的值,我认为它们会被阻塞吗?
现在,如果我将hashmap更改为ConcurrentHashMap,而不是使用sync方法,那么行为是什么?
public void method1()
{
myConcurrentHashMap.clear();
//populate the hashmap, takes about 5 seconds.
}
Run Code Online (Sandbox Code Playgroud)
如果我使用Collections.synchronizedMap怎么办?它是一样的吗?
dan*_*uch 14
CHM(ConcurrentHashMap),它不是同步公共锁上的每个方法,一次限制对单个线程的访问,而是使用称为锁条带化的更细粒度的锁定机制来允许更大程度的共享访问.任意多个读取线程可以同时访问地图,读者可以与编写者同时访问地图,并且有限数量的编写者可以同时修改地图.结果是并发访问下的吞吐量更高,单线程访问的性能损失很小.ConcurrentHashMap与其他并发集合一起,通过提供不抛出ConcurrentModificationException的迭代器,进一步改进了同步集合类,从而消除了在迭代期间锁定集合的需要.
与所有改进一样,仍有一些权衡.在整个Map上运行的方法的语义,例如size和isEmpty,已经略微削弱,以反映集合的并发性质.由于大小的结果在计算时可能已经过时,因此它实际上只是一个估计值,因此允许大小返回近似值而不是精确计数.虽然起初这可能看起来很令人不安,但实际上像size和isEmpty这样的方法在并发环境中的用处要小得多,因为这些数量是移动目标.
其次, Collections.synchronizedMap
它只是带有同步方法的简单HashMap - 我称之为对CHM弃用的dute
如果要对HashMap同步进行所有读写操作,则需要synchronize使用所有方法访问HashMap; 仅阻止一种方法是不够的.
ConcurrentHashMap允许线程安全访问您的数据而无需锁定.这意味着您可以在一个线程中添加/删除值,同时在另一个线程中获取值而不会遇到异常.另请参见ConcurrentHashMap的文档