JavaEE初阶--------第七章 HashMsp、HashTable 和 ConcurrentHashMap 之间的区别

系列文章目录

第七章 HashMsp、HashTable 和 ConcurrentHashMap 之间的区别


一、多线程环境使用哈希表

  • HashMap 本身不是线程安全的
    所以,在多线程环境下使用哈希表可以使用:
    HashTableConcurrentHashMap

1、HashTable

  • HashTable 保证线程安全,主要就是给关键方法加上了 synchronized,是直接加到方法上的(相当于是给 this 加锁)。所以当有两个线程在操作同一个 HashTable 时就会出现锁冲突。
  • 一旦触发扩容,就由该线程完成整个扩容过程。这个过程会涉及到大量的元素拷贝,效率会非常低

2、ConcurrentHashMap

相比于 HashTable 做出了一系列的改进和优化。

  • 最核心的改进把一个全局的大锁,改进成了每个链表独立的一把小锁,这样做,大幅度降低了锁冲突的概率
    就是把每个链表的头结点作为锁对象,因为 synchronized 可以使用任意对象作为锁对象。
  • 充分利用了 CAS 特性,把一些不必要加锁的环节给省略掉了
    比如:需要使用变量记录 hash 表中的元素个数。此时,就可以使用原子操作(CAS)修改元素个数。
  • 还有一个激进的操作,针对读操作没有加锁。读和读之间,读和写之间都不会有锁竞争。搭配了 volatile 关键字。ConcurrentHashMap 在底层编码过程中,比较谨慎地处理了一些细节 ,修改的时候会避免使用非原子的操作。
  • ConcurrentHashMap 针对扩容操作进行了单独的操作。(化整为零)
    HashMap 或者 HashTable 在扩容的时候,都是需要把所有的元素都拷贝一遍(如果元素很多,拷贝就比较耗时)。
    ConcurrentHashMap 一旦需要扩容,不是在一次操作中搬运完成,而是分多次来搬运,这样就可以避免单次操作过于卡顿

总结

ConcurrentHashMap 基本的使用方法和普通的 HashMap 完全一样,只是做出了一系列的改进和优化来实现多线程环境下使用哈希表。所以,在多线程环境使用哈希表,用的是 HashTable 和 ConcurrentHashMap。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值