我有以下代码。即使集合本身不是线程安全的,它也将是线程安全的吗?

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个线程同时访问该集合,则它们将不会获得对整个集合的锁定。

07-28 06:30