【问题标题】:Does a concurrent hashmap not require synchronized getters/setters?并发 hashmap 不需要同步的 getter/setter 吗?
【发布时间】:2011-01-15 18:09:21
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 你在设置什么?使用 put 和 get 设置值?或者为 hashmap 本身创建 getter 和 setter?
  • 是的,我的方法包含 put 和 get。

标签: java hashmap concurrenthashmap


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

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

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

【讨论】:

    【解决方案2】:

    1) 如果您的 getter 和 setter 方法只执行一个操作(例如 get 方法将只返回给定键的映射值)或任何线程安全操作,那么您不需要显式同步块对于那些 getter & setter。

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

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

    【讨论】:

      猜你喜欢
      • 2013-12-29
      • 1970-01-01
      • 1970-01-01
      • 2013-03-27
      • 2017-01-28
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      相关资源
      最近更新 更多