欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > HashTable, HashMap, ConcurrentHashMap 之间的区别

HashTable, HashMap, ConcurrentHashMap 之间的区别

2025/2/3 17:12:17 来源:https://blog.csdn.net/wuyunhang123456/article/details/145360221  浏览:    关键词:HashTable, HashMap, ConcurrentHashMap 之间的区别

 一、HashTable

只是将关键方法加上了锁(synchronized关键字)。

缺点:1.如果多线程访问同一个HashTable就回直接造成锁冲突。

            2.HashTable的size属性也是通过 synchronized来控制同步的,效率比较低。

            3.在扩容时会涉及大量的拷贝,效率十分低。

            4.key值不允许为null。

总结:一个HashTable只有一个锁,两个线程访问HashTable中的任意数据都会出现锁竞争。

二、HashMap

是线程不安全的,在多线程环境下,如果多个线程同时对 HashMap 进行读写操作,可能会导致数据不一致或出现并发修改异常等问题。

key值允许为null。

三、ConcurrentHashMap

相对于HashTable进行了优化,使用了更细的锁机制和CAS机制。以JDK1.8为例:

1.读操作没有加锁,但是使用了volatile来保证只从内存中读取结果。

2.对写操作进行了加锁,加锁方式依旧是synchronized,但是不是对整个对象进行加锁,而是对“桶”进行加锁(用每个链表的头结点作为锁对象),大大降低了锁冲突的概率。

3.size属性使用CAS来更新,避免了重量级锁的情况。

4.扩容策略改变:

<1>:发现需要扩容的线程,只创建一个数组,同时只搬几个数据过去。

<2>:扩容时期,新老数组同时存在。

<3>:后续每个来操作ConcurrentHashMap的线程,都会参与搬家的过程,每次只搬一小部分元素。

<4>:当搬好后,将老数组删除。

<5>:在搬家过程中,若执行插入操作,则只向新数组中插入。

<6>:搬家时,执行查找操作时,需要同时查找新老数组。

5.key值不允许为null。

总结:ConcurrentHashMap每个哈希桶上都有一把锁,只有两个线程恰好访问同一个哈希桶时才会出现锁冲突。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com