我打算在多线程环境下面使用Map。谁能告诉我下面3种Map的不同?Hashtable
Collections.synchronizedMap(Map)
ConcurrentHashMap

解决方案 »

  1.   

    Hashtable
    类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值。为了成功地在哈希表中存储和获取对象,用作键的对象必须实现 hashCode 方法和 equals 方法。
    Collections.synchronizedMap(Map)  同步MAPConcurrentHashMap
    ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术。它使用了多个锁来控制对hash表的不同部分进行的修改。
      

  2.   

    Hashedtable貌似就是在HashMap代码的基础上加了方法同步。Collections.synchronizedMap(Map)是对非同步map加同步,现在是推荐的使用方法,两者差别不大,Hashedtable和Vector貌似不太推荐使用了。Vector貌似是因为内存扩充的方式不太优化。Hashedtable不推荐使用的原因我现在也不是太了解。ConcurrentHashMap是concurrent包中的同步map的实现,concurrent本是一个优秀的同步工具类包。
    jdk1.5引入了它。
    ConcurrentHashMap如楼上所说,是通过散列segment的方式,将数据两次散列,并将同步锁两次分离。
    达到数据冲突量变小,从而达到访问提速的效果。
      

  3.   

    自己看API文档,上面解说的挺详细的,英文的看不懂的话,可以找份中文的!
      

  4.   

    ConcurrentHashMap 虽然是一个并发容器,但是它的效率比非同步容器 HashMap 还要高。ConcurrentHashMap 并不是采用了一把锁,在默认情况下采用了 16 把锁,每把锁只锁住不同的部分,这种同步锁的技术称为“分离锁”,分离锁的应用能在高并发的情况下拥有非常良好的性能。多线程环境下,毋庸置疑应该选择 ConcurrentHashMap。但是这个并发容器的 size() 方法由于可以进行并发修改,因此并不能真实表示当前的容量,比如说在 size 返回时其他线程添加了一条数据,这就导致实际返回的 size 也实际大小不符,使用时需要注意。