multithreading环境中的Hashmap和哈希表

我真的很困惑这两个集合在multithreading环境中的表现。

哈希表是同步的,这意味着没有2个线程同时更新它的值吗?

查看用于线程安全映射的ConcurrentHashMap 。

它们提供HashTable的所有function,其性能非常接近HashMap。

通过代替使用地图宽锁获得性能,该集合默认维护一个包含16个锁的列表,每个锁用于锁定地图的单个存储桶。 您甚至可以配置桶的数量:)根据您的数据调整这可以帮助提高性能。

我不能在Brian Goetz http://jcip.net/中推荐足够的Java Concurrency in Practice

每次读到它我都会学到新东西。

另请注意,Hashtable和Collections.synchronizedMap仅对单个操作安全。 任何涉及需要primefaces的多个键或check-then-act的操作都不会如此,并且需要额外的客户端锁定。

例如,如果没有额外的锁定,则无法编写以下任何方法:

  • 交换两个不同键的值: swapValues(Map, Object k1, Object k2)

  • 将参数附加到键的值: appendToValue(Map, Object k1, String suffix)

是的,所有这些都在JCIP中涵盖:-)

确切地说,HashTable是同步的,这意味着在multithreading环境中使用它是安全的(许multithreading访问相同的HashTable)如果两个线程尝试同时更新哈希表,其中一个将不得不等待另一个线程完成他的更新。

HashMap未同步,因此速度更快,但您可能在multithreading环境中遇到问题。

是的,所有方法都是primefaces方式完成的,但是value()方法不是(参见docs )。

Paul比我推荐java.util.concurrent包更快,它为multithreading环境提供了非常精细的控制和数据结构。

Hashtables是同步的,但它们是一个旧的实现,你几乎可以说它已被弃用。 此外,它们不允许空键(也许不是空值?不确定)。

一个问题是尽管每个方法调用都是同步的,但是大多数有趣的操作需要多个调用,因此您必须围绕多个调用进行同步。

通过调用以下内容,可以为HashMaps获得类似的同步级别:

 Map m = Collections.synchronizedMap(new HashMap()); 

它在同步方法调用中包装映射。 但这与Hashtable具有相同的并发缺陷。

正如Paul所说,ConcurrentHashMaps为primefaces更新提供了其他有用的方法的线程安全映射。