HashTable和ConcurrentHashMap的区别

HashTable和ConcurrentHashMap的区别

HashTable

HashTable是线程安全的,对关键方法都提供了sunchronized, 相当于针对this加锁.
这里也会出现一些问题?

当我们去任意的针对对象进行操作,都会涉及到对this的加锁.此时此刻,有很多线程
都想操作对象,就一定会出发激烈的锁竞争,最后只能排队一个一个执行,并发效率非常低效.

ConcurrentHashMap

对于HashTable,当两个key通过hash函数映射到同一个数组下标时,就会出现hash冲突.
所以我们在数组下标后面增加一个链表,来存储值,数据更多的话就又连接上红黑树了.
数组-> 链表 -> 红黑树
对于ConcurrentHashMap,有两个修改操作,是针对两个不同的链表进行修改, 此时是没有
线程安全问题的!
但是如果是针对同一个链表进行修改,可能会出现线程安全问题.此时ConcurrentHashMap
就把每个链表都加上了一把锁,此时就可以用链表头结点作为锁对象.

ConcurrentHashMap改进

  1. 减小了锁的粒度,每个链表有一把锁,大部分情况下都不会涉及到锁冲突.
  2. 广泛使用了CAS操作,针对两个线程的size++操作也不会有锁冲突.
  3. 写操作进行了加锁, 多操作没有加锁.
  4. 针对扩容操作进行了渐进式优化:
    • HashTable触发扩容,就会一口气完成所有元素的搬运,这个过程非常耗时.
    • ConcurrentHashMap会创建出一个更大的数组, 逐渐的把旧数据往新数组上搬运,可能会有一段时间旧数组和新数组同时存在.
      当进行新增元素时,会把新元素往新数组上插入.
      进行删除元素时,把旧数组的元素删除即可.
      进行查找元素时,对新旧数组都进行查找.
      进行修改元素时,统一在新数组上修改.

小结

对于HashMap和ConcurrentHashMap的区别, 主要是线程不安全和线程安全的区别…
上述比克详细总结了HashMap和ConcurrentHashMap的区别, 希望有收获的小伙伴动动手指,
多多支持.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值