concurrenthashmap跟hashtable
时间: 2023-09-15 22:23:21 浏览: 94
他们都是用于存储键值对的数据结构,但在实现和使用方面有一些不同。
1. 同步性:Hashtable 是线程安全的,它的所有方法都是同步的,这意味着多个线程可以同时访问和修改Hashtable的内容。而ConcurrentHashMap 是通过使用分段锁(segment-level locking)实现的并发性,它将数据分为多个段(segments),每个段都有自己的锁,不同的线程可以同时访问不同的段,从而提高了并发性能。
2. 性能:由于ConcurrentHashMap 使用了分段锁的机制,它在多线程环境下的读操作性能比Hashtable要好。而Hashtable 的所有操作都是同步的,当多个线程同时访问时会产生竞争,可能会导致性能下降。
3. 允许 null 值:Hashtable 不允许键或值为null,如果插入了null键或值会抛出NullPointerException。而ConcurrentHashMap 允许null键和null值。
4. 迭代器:ConcurrentHashMap 的迭代器是弱一致性的(weakly consistent),它不会抛出ConcurrentModificationException 异常,可以在迭代过程中允许其他线程对Map进行修改,但迭代结果不一定是最新的。而Hashtable 的迭代器是强一致性的(fail-fast),如果在迭代过程中有其他线程对Map进行修改,会抛出ConcurrentModificationException 异常。
总的来说,如果在多线程环境下需要高并发性能,并且允许键或值为null,推荐使用ConcurrentHashMap。而如果是单线程环境或者需要强一致性迭代器的场景,可以选择Hashtable。
阅读全文