concurrenthashmap(concurrenthashmap jdk18)

刺骨的言语ヽ痛彻心扉 2023-09-26 13:24 278阅读 0赞

HashMap HashTable和ConcurrentHashMap的区别

(条理上还需要整理,也是先说相同点,再说不同点)

HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,在只有一个线程访问的情况下,效率要高于Hashtable。

HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。

HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。

Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。

最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。

Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。

就HashMap与HashTable主要从三方面来说。

一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现

二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的

三.值:只有HashMap可以让你将空值作为一个表的条目的key或value类 hashmap

所已实现接口:serializable, cloneable, map

基于哈希表 map 接口实现实现提供所选映射操作并允许使用 null 值 null 键(除非同步允许使用 null 外hashmap 类与 hashtable 致相同)类保证映射顺序特别保证该顺序恒久变

类 concurrenthashmap

所已实现接口:

serializable, concurrentmap, map

支持获取完全并发更新所期望调整并发哈希表类遵守与

hashtable 相同功能规范并且包括应于 hashtable 每版本尽管所操作都线程安全获取操作

必锁定并且 支持某种防止所访问式锁定整表类通程序完全与 hashtable

进行互操作取决于其线程安全与其同步细节关

类与 hashtable 相似与 hashmap 同 允许 null 用作键或值最大的区别就是ConcurrentHashMap是线程安全的,hashMap不是线程安全的。

为什么线程安全呢:

ConcurrentHashMap代码中可以看出,它引入了一个“分段锁”的概念,具体可以理解为把一个大的Map拆分成N个小的HashTable,根据key.hashCode()来决定把key放到哪个HashTable中。

在ConcurrentHashMap中,就是把Map分成了N个Segment,put和get的时候,都是现根据key.hashCode()算出放到哪个Segment中:

concurrenthashmap

java 如何遍历concurrenthashmap

和遍历HashMap是一样的,有多种方法,给出计算较少的一种

ConcurrentHashMap map=….数据

for(Map.Entry e: map.entrySet() ){

System.out.println(“键:”+e.getKey()+”, 值:”+e.getValue());

}参考如下内容:

concurrenthashmap锁的方式是稍微细粒度的。 concurrenthashmap将hash表分为16个桶(默认值),诸如get,put,remove等常用操作只锁当前需要用到的桶。

试想,原来 只能一个线程进入,现在却能同时16个写线程进入(写线程才需要锁定,而读线程几乎不受限制,之后会提到),并发性的提升是显而易见的。

更令人惊讶的是concurrenthashmap的读取并发,因为在读取的大多数时候都没有用到锁定,所以读取操作几乎是完全的并发操作,而写操作锁定的粒度又非常细,比起之前又更加快速(这一点在桶更多时表现得更明显些)。只有在求size等操作时才需要锁定整个表。

而在迭代时,concurrenthashmap使用了不同于传统集合的快速失败迭代器的另一种迭代方式,我们称为弱一致迭代器。在这种迭代方式中,当iterator被创建后集合再发生改变就不再是抛出 concurrentmodificationexception,取而代之的是在改变时new新的数据从而不影响原有的数 据,iterator完成后再将头指针替换为新的数据,这样iterator线程可以使用原来老的数据,而写线程也可以并发的完成改变,更重要的,这保证了多个线程并发执行的连续性和扩展性,是性能提升的关键。

下面分析concurrenthashmap的源码。主要是分析其中的segment。因为操作基本上都是在segment上的。先看segment内部数据的定义。

发表评论

表情:
评论列表 (有 0 条评论,278人围观)

还没有评论,来说两句吧...

相关阅读