【问题标题】:ConcurrenthashMap and thread safetyConcurrentHashMap 和线程安全
【发布时间】:2014-03-04 08:57:30
【问题描述】:

ConcurrenthashMap 的 javadocs 说:

支持全并发检索和可调整的哈希表 更新的预期并发。此类遵循相同的功能 规范为 Hashtable,并包括方法的版本 对应Hashtable的各个方法。然而,即使所有 操作是线程安全的,检索操作不需要 锁定,并且不支持将整个表锁定在 一种阻止所有访问的方法。 这个类与 程序中的哈希表依赖于其线程安全但不依赖于其 同步详情。

上面这段话的意思是什么?

这个类在依赖的程序中与 Hashtable 完全可互操作 关于它的线程安全而不是它的同步细节

【问题讨论】:

    标签: java collections thread-safety


    【解决方案1】:

    Hashtable 方法是synchronized,您可以编写代码块确保 Hashtable 的状态不会在中间发生变化:

    syncronized (hashtable) {
        if (!hashtable.contains(key))
            hashtable.put(key, value);
    }
    

    ConcurrentHashMap 的方法不是 synchronized(尽管仍然是线程安全的,如 javadoc 中所指定),您无法与其状态同步执行复合操作。

    注意:上面的示例复合操作在ConcurrentHashMap api: putIfAbsent(K, V) 中有一个完美的等价物,但其他一些有用的操作却没有。

    【讨论】:

    • you can't perform compound operations synchroniously with it's state 意味着我们不能将上面的代码与synchronized(concurrenthashmap_obj)一起使用?
    • @aLearner 是的。语法上你当然可以,但这对线程安全没有意义
    【解决方案2】:

    在 Hashtable 的 javadocs 中找到了这个:

    从 Java 2 平台 v1.2 开始,这个类被改造为 实现 Map 接口,使其成为 Java 的成员 集合框架。与新的集合实现不同, 哈希表是同步的。如果线程安全的实现不是 需要时,建议使用 HashMap 代替 Hashtable。如果一个 需要线程安全的高并发实现,那么它是 建议使用 ConcurrentHashMap 代替 Hashtable。

    我认为他们说 Hashtable 具有同步方法,但新的 ConcurrentHashMap 不使用同步来确保线程安全。至于“可互操作”,我认为这意味着界面基本相同——所以你可以使用任何一个。

    【讨论】:

      猜你喜欢
      • 2012-08-20
      • 2019-09-22
      • 2011-04-15
      • 1970-01-01
      • 2016-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-13
      相关资源
      最近更新 更多