并发hashmap不需要同步的getter / setter吗?

时间:2011-01-15 18:09:21

标签: java hashmap concurrenthashmap

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

另外,没有同步的并发hashmap比具有synchronized getter和setter的hashmap更快吗?这适用于高性能系统

谢谢

2 个答案:

答案 0 :(得分:7)

  1. java.util.concurrent.ConcurrentHashMap是线程安全的
  2. 比使用synchronized(object)
  3. 更快
  4. 您还需要注意不要通过像

    这样的代码创建“逻辑”竞争条件
    if (map.get(key) != null) {
        map.put(key, new SomethingStrictlyUnique());
    }
    
  5. 根据经验,将同步集合替换为并发集合可以提供显着的可伸缩性改进而风险很小。

  6. 根据the javadoc,ConcurrentHashMap返回的迭代器是“弱一致的”(而不是fail-fast),因此它们容忍并发修改,遍历构造迭代器时存在的元素,并且< em> may 反映了构造迭代器后对集合的修改。

答案 1 :(得分:1)

1)如果你已经得到了&amp; setter方法只执行一个操作(比如get方法只返回给定键的映射值)或任何线程安全操作,那么你不需要为那些getter&amp; amp;设定器。

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

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

相关问题