我有以下代码。即使集合本身不是线程安全的,它也将是线程安全的吗?
private ConcurrentMap<REGISTRY, Set<CONTACT_ROLES>> proxyRoles = new ConcurrentHashMap<REGISTRY, Set<CONTACT_ROLES>>();
public void setProxyRoles(ConcurrentMap<REGISTRY, Set<CONTACT_ROLES>> proxyRoles) {
this.proxyRoles = proxyRoles;
}
public ConcurrentMap<REGISTRY, Set<CONTACT_ROLES>> getProxyRoles() {
return proxyRoles;
}
public synchronized void addProxyRole(REGISTRY reg, CONTACT_ROLES role) {
if(proxyRoles.get(reg) == null){
proxyRoles.put(reg, new HashSet<CONTACT_ROLES>());
}
proxyRoles.get(reg).add(role);
}
编辑:
经过一些很好的回答后,我了解到我的解决方案并不安全,因此我在Google上搜索了一下,并在ConcurrentSkipListSet中找到了一个很好的替代品
最佳答案
从Javadoc:
哈希表支持完全并发的检索和可调
预期的并发更新。此类遵循相同的功能
规范作为哈希表,并包括方法的版本
对应于Hashtable的每种方法。 但是,即使所有
操作是线程安全的,检索操作不需要
锁定,并且不支持将整个表锁定在
一种阻止所有访问的方法。
因此,如果2个线程同时访问该集合,则它们将不会获得对整个集合的锁定。