【问题标题】:Specific usage of Hashtable over ConcurrentHashMapHashtable over ConcurrentHashMap的具体用法
【发布时间】:2012-08-17 14:17:30
【问题描述】:

ConcurrentHashMap 在 1.5 中作为 java java.util.concurrent 包的一部分引入。在此之前,拥有threadsafe 映射的唯一方法是使用HashTableCollections.synchronizedMap(Map)

对于所有实际用途(多线程环境),ConcurrentHashMap 足以满足需要,除了线程需要地图的统一视图 的情况。

我的问题是,除了拥有地图的统一视图之外,是否还有其他情况无法选择 ConcurrentHashMap

【问题讨论】:

  • 您可能会发现某些情况下,其中一种或另一种的性能低于您的要求。也许在重载时。不过你需要测量这些东西。
  • 什么是“统一视图”?你能解释一下吗...
  • @yegor256,统一视图是映射条目的视图,当线程访问此特定映射时,它不会更改。

标签: java concurrency hashtable concurrenthashmap


【解决方案1】:

Hashtable 的使用自 Java 1.2 以来一直不鼓励使用,synchronizedMap 的实用性非常有限,并且由于锁定粒度太细,几乎总是最终不足。但是,当您确实遇到单个更新是您需要的粒度大小的情况时,ConcurrentHashMap 是比synchronizedMap 更好的选择。它具有更好的并发性、线程安全的迭代器(不,synchronizedMap 没有——这是由于其设计为非线程安全映射的包装器)、更好的整体性能,并且几乎没有额外的内存重量来支付这一切。

【讨论】:

    【解决方案2】:

    这是一个延伸,但我将把它作为一个用例。

    如果您需要一个线程安全的 Map 实现,您可以执行一些额外的复合操作,这些操作通过 ConcurrentMap 不可用。假设您要确保在添加第三个对象之前不存在另外两个对象。

    Hashtable t = new Hashtable();
    
    synchronized(t){
       if(!t.contains(object1) && !t.contains(object2)){
          t.put(object3,object3);
       }
    }
    

    同样,这是一个延伸,但您无法在确保原子性和线程安全的同时使用 CHM 实现这一点。因为Hashtable 及其synchronizedMap 对应部分的所有操作在 Map 实例上同步,这确保了线程安全。

    在一天结束的时候,我很少使用synchronizedMap/Hashtable,我建议你也应该这样做。

    【讨论】:

      【解决方案3】:

      据我了解,ConcurrentMapHashTableCollections.synchronizedMap() 的替代品,用于线程安全。不鼓励使用所有类。因此,您的问题的答案是“不,没有其他情况”。

      另请参阅:What's the difference between ConcurrentHashMap and Collections.synchronizedMap(Map)?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-20
        • 2016-06-27
        • 1970-01-01
        • 1970-01-01
        • 2016-08-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多