4

如果我使用并发哈希图并且我有设置和获取值的方法,因为我使用并发哈希图我需要使 getter 和 setter 同步吗?这是多余的吗?一种设计更好吗?

此外,没有同步的并发 hashmap 是否比具有同步 getter 和 setter 的 hashmap 快?这是一个高性能系统

谢谢

4

2 回答 2

7
  1. java.util.concurrent.ConcurrentHashMap是线程安全的
  2. 它比使用更快synchronized(object)
  3. 您仍然需要注意不要通过这样的代码创建“逻辑”竞争条件

    if (map.get(key) != null) {
        map.put(key, new SomethingStrictlyUnique());
    }
    
  4. 根据经验,用并发集合替换同步集合可以提供显着的可伸缩性改进,并且风险很小。

  5. 根据javadoc, ConcurrentHashMap 返回的迭代器是“弱一致的”(而不是快速失败),因此它们容忍并发修改,遍历构造迭代器时存在的元素,并可能反映构造后对集合的修改迭代器。

于 2011-01-15T21:07:02.670 回答
1

1) 如果你的 getter 和 setter 方法只执行一个操作(比如 get 方法只会返回给定键的映射值)或任何线程安全操作,那么你不需要为这些 getter 显式同步块&二传手。

2)是的,使用没有同步块的并发hashmap将大大提高性能。

注意:ConcurrentHashMap 是弱一致的,这在大多数情况下是可以接受的。

于 2013-11-15T17:53:16.337 回答