JAVA——HashTable, HashMap, ConcurrentHashMap 之间的区别

1、HashMap在多线程环境下是线程不安全的,HashTable、ConcurrentHashMap在多线程环境下是线程安全的。
2、在多线程环境下,HashTable和ConcurrentHashMap的锁粒度不同。HashTable的锁粒度更大,整个哈希表只有一把锁控制,而ConcurrentHashMap的锁粒度比较小,它的每一个链表有一把锁控制,这样的好处是当两个线程访问同一个对象时,访问到同一把锁的概率大大降低,发生锁冲突的概率大大降低。

在这里插入图片描述
3、ConcurrentHashMap采用了一个激进的优化方式,只对写操作进行加锁。当多个线程进行读操作时,不加锁;一个线程进行读操作时,另一个线程进行写操作时,不加锁,ConcurrentHashMap采用volatile关键字保证一边进行读操作一边进行写操作时,能够读到及时的数据。
4、ConcurrentHashMap采用CAS特性。其优化策略是尽一切可能降低锁冲突的概率。加锁有可能降低代码的性能。
5、ConcurrentHashMap对哈希表的扩容操作进行了特殊操作,其扩容并不是像顺序表那样申请一个更大的数组然后一次性将旧数组上的数据拷贝到新数组里。而是采用了“化整为零”的思想。一部分一部分的数据拷贝到新数组里,不是一次性全部拷贝到数组里。在这个拷贝的过程中,如果要进行查询元素操作,那么旧数据和新数据里的数据一块查询,如果要进行插入元素操作,直接在新数组上进行插入,如果要进行删除操作,直接在旧数组上进行操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值